2011-09-07 16 views
2

我想將大數據集(> 30Gb)追加到現有的pytables表中。該表爲N列,數據集爲N-1列;我知道其他N-1列後計算一列。將大量數據附加到表(HDF5)數據庫,其中database.numcols!= newdata.numcols?

我使用numpy.fromfile()在將數據集附加到數據庫之前將數據集的塊讀入內存。理想情況下,我想將數據粘貼到數據庫中,然後計算最後一列,然後使用Table.modifyColumn()完成操作。

我已經考慮追加numpy.zeros((len(new_data), N))表中,然後使用Table.modifyColumns()填寫新的數據,但我希望有人知道一個很好的方式,以避免產生巨大的每個塊空的數據,我需要的數組附加。

+0

我很困惑。爲什麼不只是追加一列零? np.zeros(len(new_data,1)) –

+0

我也很困惑。爲了什麼你建議我追加一列零? – Phil

+0

你能提供一個代碼示例嗎?我想我現在明白,你使用numpy從hdf5文件和PyTables中讀取數據來操縱(不同的?)hdf5文件?爲什麼不在插入表之前用numpy .concatenate擴展數組?我想我不確定你的目標是什麼。 –

回答

1

如果列都是相同類型的,你可以使用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是記錄數組(即具有複雜的dtype),這將不起作用。爲此,您可以嘗試numpy.lib.recfunctions.append_fields。因爲它會將數據複製到一個新的數組中,所以它不會爲您節省大量的內存,但它可以讓您一次完成所有的寫入。

+0

b是否使用相同的內存作爲?如果是這樣,我在做生意!謝謝。 – Phil

+0

是的,'b'使用與'a'相同的內存。 – AFoglia

1

您可以將結果添加到另一個表中。除非計算列與其他列相鄰有一些令人信服的理由,否則這可能是最簡單的。無論如何,從計算中分離原始數據還有一些東西需要說明。

如果您必須增加表格的大小,請使用h5py查看。它提供了一個更直接的接口到h5文件。請記住,根據在h5文件中創建數據集的方式,可能無法簡單地向數據附加列。有關通用數據格式的討論,請參見http://www.hdfgroup.org/HDF5/doc/UG/03_DataModel.html中的第1.2.4節「數據空間」。如果底層數據集支持,h5py支持resize

你也可以使用一個緩衝輸入數據存儲,像這樣:

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) 
+0

把所有東西放在一起都有令人信服的理由。數據類似於「時間」和「樣本」,其中「時間」是計算值。我會研究h5py。 – Phil

+0

感謝您的更新迴應。我不知道爲什麼我認爲我必須在每次傳球時生成虛擬數據... – Phil

相關問題