Python 将大量数据追加到表(HDF5)数据库,其中database.numcols!=newdata.numcols?
我试图将一个大数据集(>30Gb)附加到现有的pytables表中。表为N列,数据集为N-1列;一列是在我知道其他N-1列之后计算的 我正在使用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()填充新数据,但我希望有人知
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
相同的内存。