Python 将大量数据追加到表(HDF5)数据库,其中database.numcols!=newdata.numcols?

Python 将大量数据追加到表(HDF5)数据库,其中database.numcols!=newdata.numcols?,python,numpy,hdf5,pytables,Python,Numpy,Hdf5,Pytables,我试图将一个大数据集(>30Gb)附加到现有的pytables表中。表为N列,数据集为N-1列;一列是在我知道其他N-1列之后计算的 我正在使用numpy.fromfile()将数据集的块读取到内存中,然后再将其附加到数据库中。理想情况下,我希望将数据粘贴到数据库中,然后计算最后一列,最后使用Table.modifyColumn()完成操作 我曾考虑将numpy.zero((len(new_data),N))添加到表中,然后使用table.modifyColumns()填充新数据,但我希望有人知

我试图将一个大数据集(>30Gb)附加到现有的pytables表中。表为N列,数据集为N-1列;一列是在我知道其他N-1列之后计算的

我正在使用
numpy.fromfile()
将数据集的块读取到内存中,然后再将其附加到数据库中。理想情况下,我希望将数据粘贴到数据库中,然后计算最后一列,最后使用
Table.modifyColumn()
完成操作


我曾考虑将
numpy.zero((len(new_data),N))
添加到表中,然后使用
table.modifyColumns()
填充新数据,但我希望有人知道一种好方法,避免为我需要添加的每个块生成大量空数据。

您可以将结果添加到另一个表中。除非有令人信服的理由使计算列与其他列相邻,否则这可能是最简单的。无论如何,要把原始数据和计算结果分开是有道理的

如果必须增加表的大小,请考虑使用。它为h5文件提供了更直接的接口。请记住,根据数据集是如何在h5文件中创建的,可能无法简单地在数据中添加列。有关通用数据格式的讨论,请参见中的第1.2.4节“数据空间”。如果基础数据集支持h5py,则h5py支持它

您也可以使用单个缓冲区来存储输入数据,如下所示:

z = zeros((nrows, N))
while more_data_in_file:
    # Read a data block
    z[:,:N-1] = fromfile('your_params')
    # Set the final column
    z[:,N-1:N] = f(z[:,:N-1])
    # Append the data
    tables_handle.append(z)

如果列的类型都相同,可以使用
numpy.lib.stride\u技巧.as\u stride
使从shape(L,N-1)文件中读取的数组看起来像shape(L,N)。比如说,

In [5]: a = numpy.arange(12).reshape(4,3)

In [6]: a
Out[6]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])

In [7]: a.strides
Out[7]: (24, 8)

In [8]: b = numpy.lib.stride_tricks.as_strided(a, shape=(4, 4), strides=(24, 8))

In [9]: b
Out[9]: 
array([[  0,   1,   2,   3],
       [  3,   4,   5,   6],
       [  6,   7,   8,   9],
       [  9,  10,  11, 112]])
现在,您可以使用此数组
b
填充表格。每行的最后一列将与下一行的第一列相同,但在可以计算值时将覆盖它们


如果
a
是记录数组(即具有复杂的数据类型),则此操作不起作用。为此,您可以尝试
numpy.lib.recfunctions.append\u fields
。由于它会将数据复制到一个新数组中,因此不会为您节省大量内存,但它允许您一次完成所有写入操作。

我感到困惑。为什么不加一列零呢?np.zero(len(new_data,1))我也很困惑。你建议我在什么后面加一列零?你能提供一个代码示例吗?我想我现在明白了,您正在使用numpy从hdf5文件读取数据,而使用PyTables操作(不同的?)hdf5文件?为什么不在插入表之前使用numpy.concatenate扩展数组?我想我不确定你的目标是什么。我正在从文件中读取二进制数据片段。文件太大,无法使用
numpy
(AFAIK)轻松操作,因此我将数据复制到一个HDF5文件中,以便使用
表格
模块操作数据。我读取的每个片是2^26字节。我的主要目标是避免不必要的数据复制。难道不
numpy.concatenate
创建输入的副本吗?有令人信服的理由将所有内容保持在一起。数据类似于“时间”和“样本”,其中“时间”是计算值。我会调查h5py的。谢谢你的最新回复。我不知道为什么我认为我必须在每次传递时生成虚拟数据…b是否使用与a相同的内存?如果是这样的话,我是做生意的!谢谢。是的,
b
使用与
a
相同的内存。