2012-08-16 49 views
2

我想了解函數對numpy數組與h5py dataset的影響。在我的應用程序中,我正在逐行讀取文本文件,然後在解析數據後,寫入hdf5文件。什麼是一個很好的方法來實現這一點。我要補充的每個新行成numpy陣列,並保持調整(增加軸)爲numpy的陣列(最終寫完整numpy的陣列到h5py數據集)或者我應該只是每個新行的數據添加到h5py dataset直接,因此調整內存中的h5py dataset。如果我們在每行之後繼續調整大小,resize()函數如何影響性能?還是應該在每隔100行或1000行後重新調整大小?調整numpy或數據集大小的有效方法?

每個數據集中可能有大約200,000行。

任何幫助表示讚賞。

+0

那些不知道h5py的人,請在添加新行後每次調整numpy的性能以便對它進行評論。 – Alok 2012-08-16 01:05:53

+0

爲什麼不使用'np.fromfile'將整個文件作爲一個numpy數組讀取?你不會得到更快的速度...... – mgilson 2012-08-16 01:14:09

+0

文本文件是我需要解析並轉換成特定格式的原始數據。文件大小約爲2 GB。我正在逐字節處理數據。 – Alok 2012-08-16 01:24:37

回答

2

我認爲resize()會複製數組中的所有數據,如果重複調用它,速度會很慢。

如果要連續向數組中追加數據,可以先創建一個大數組,然後使用索引將數據複製到該數組中。

或者你可以使用數組模塊中的數組對象,它是一個動態數組,它的行爲與列表類似。將所有數據追加到數組對象後,可以將其轉換爲ndarray。下面是一個示例:

import array 
import numpy as np 
a = array.array("d") 
a.extend([0,1,2]) 
a.extend([3,4,5]) 
b = np.frombuffer(a, np.float).reshape(-1, 3) 
1

NumPy數組的設計不是調整大小。這是可行的,但是在內存方面浪費(因爲你需要創建比第一個數組大的第二個數組,然後用你的數據填充它......這是你必須保留的兩個數組),當然還有時間(創建臨時數組)。 你最好從列表開始(或者按照@HYRY的建議使用常規數組),然後當你有足夠大的塊時轉換爲ndarrays。 問題是,你什麼時候需要做轉換?

+0

謝謝@pierre。我已經實施了HYRY的解決方案。此數組僅存儲轉換後的數據。我需要將這些數據寫入hdf5文件。我猜它類似於hdf5文件,我不應該逐行寫入數據。我將首先讀取完整的文件並將數據解析爲數組對象,然後將該對象寫入hdf5文件。謝謝。 – Alok 2012-08-17 05:07:33

相關問題