Python 如何在pytables/hdf5中存储宽表

Python 如何在pytables/hdf5中存储宽表,python,numpy,hdf5,pytables,Python,Numpy,Hdf5,Pytables,我的数据来自一个csv,它有几千列和一万(或更多)行。在每列中,数据的类型相同,但不同的列具有不同类型的数据*。以前我一直在从numpy中提取数据并将其存储在磁盘上,但速度相当慢,特别是因为我通常希望加载一些列的子集,而不是所有列 我想使用pytables将数据放入hdf5,我的第一种方法是将数据放入一个表中,每个csv列有一个hdf5列。不幸的是,由于512(软)列限制,我认为这不起作用 存储这些数据的合理方法是什么 *我的意思是,从文本转换后的数据类型。也许您可以增加列数而不会降低性能。见:

我的数据来自一个csv,它有几千列和一万(或更多)行。在每列中,数据的类型相同,但不同的列具有不同类型的数据*。以前我一直在从numpy中提取数据并将其存储在磁盘上,但速度相当慢,特别是因为我通常希望加载一些列的子集,而不是所有列

我想使用pytables将数据放入hdf5,我的第一种方法是将数据放入一个表中,每个csv列有一个hdf5列。不幸的是,由于512(软)列限制,我认为这不起作用

存储这些数据的合理方法是什么


*我的意思是,从文本转换后的数据类型。

也许您可以增加列数而不会降低性能。见:

C.1.1。建议的最大值

最大列数

Maximum number of columns in Table objects before a PerformanceWarning is issued. This limit is somewhat arbitrary and can be increased.

如果您想走这条路,只需在pytables目录中找到parameters.py文件并更改MAX_COLUMNS值。

事实上,这可能无法以简单的方式实现。HDF5为每个数据集分配64 kb的元数据空间。此元数据包括列的类型。因此,虽然列的数量是一个软限制,但在2-3000个范围内的某个地方,通常会耗尽存储元数据的空间(取决于列名的长度等)


此外,numpy是否将列数限制为32?您现在如何用numpy表示数据?可以进入numpy数组的任何内容都应该对应于pytables数组类。

您应该能够使用dataframe
它可以保存到磁盘,而无需转换为csv。这取决于您以后想对数据做什么以及一次需要多少数据。不久前,我不得不建立一个统计验证程序,我们有两种方法:

  • 在单独的表中拆分列(例如,使用FK)。加载它们的开销并不太高
  • 对表进行转置,产生类似键值存储的结果,其中键是(列、行)的元组
  • 对于这两种情况,我们都使用了postgres。

    没有pytables,但是使用它,这可能会起作用:

    data = np.recfromcsv(args[0], delimiter=',',
                         case_sensitive=True, deletechars='', replace_space=' ')
    with h5py.File(args[1], 'w') as h5file:
        h5file.create_dataset('table', data=data)
    
    我借用了他的第一行;不确定这对你是否有效。
    HDF 5表看起来不错(通过hdfview快速查看);当然,我不知道你是否可以用PyTabe和熊猫来使用它。

    是的,我确实考虑过这个问题,但是我想如果我必须从一开始就改变这种配置,我可能做得不对。如果你的数据是稀疏的(这意味着许多行只有一小部分的列值存在)。您可以尝试重构您的表。或者,我知道numpy有一些选项,可以通过x,y=np.loadtxt(file,delimiter=',',usecols=(0,2))只加载某些列。因此,一旦您在磁盘上有了数据,就可以加载不同的列子集。我不确定函数是否针对这种情况进行了优化。当前是否存储为numpy数组的常规字典。numpy中是否有32列限制?没有这样的限制。numpy永远不会有这样的限制。@PhilCooper OP可能是指“维度”而不是列。numpy的维度限制为32。