3

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

在将数据集附加到数据库之前,我正在使用numpy.fromfile()将数据集的块读入内存。理想情况下,我想将数据粘贴到数据库中,然后计算最后一列,最后通过 usingTable.modifyColumn()完成操作。

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

4

2 回答 2

2

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

如果您必须增加表格的大小,请考虑使用h5py。它为 h5 文件提供了更直接的接口。请记住,根据在 h5 文件中创建数据集的方式,可能无法简单地将列附加到数据中。有关一般数据格式的讨论,请参见http://www.hdfgroup.org/HDF5/doc/UG/03_DataModel.html中的第 1.2.4 节“数据空间” 。如果底层数据集支持, 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)
于 2011-09-07T01:49:46.293 回答
2

如果列都是相同的类型,您可以使用numpy.lib.stride_tricks.as_strided使您从形状 (L, N-1) 的文件中读取的数组看起来像形状 (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_fields. 由于它将数据复制到一个新数组,它不会为您节省任何大量内存,但它可以让您一次完成所有写入。

于 2011-09-07T02:30:39.387 回答