2012-08-02 75 views
3

我通過numpy.loadtxt將一個csv文件加載到一個numpy數組中。我的數據有大約100萬條記錄和87列。雖然object.nbytes只有177159666個字節,但它實際上需要更多的理論,因爲我在使用scikit-learn培訓決策樹時遇到'MemoryError'。此外,在閱讀數據後,我係統中的可用內存減少了1.8個演出。我正在使用3個內存的linux機器上工作。那麼object.nbytes是否會返回一個numpy數組的實際內存使用情況?Numpy數組佔用太多內存

train = np.loadtxt('~/Py_train.csv', delimiter=',', skiprows=1, dtype='float16') 
+1

那麼,你有沒有問題? – Marcin 2012-08-02 15:01:17

+2

這裏有一個相關的問題:http://stackoverflow.com/questions/11527964/convert-a-string-list-to-float32-efficiently。基本上,np.loadtxt佔用很多內存,因爲它首先將數據存儲在列表中,然後將這些數據轉換爲一個ndarray。 (至少將內存使用量增加3或4倍)。如果您知道大小,您可能需要考慮預先分配數組並自己解析它。另外,不要害怕查看np.loadtxt的源代碼。這是合理的理解。 – mgilson 2012-08-02 15:03:08

+0

@Marcin,剛剛更新了我的問題。 – ibictts 2012-08-02 15:05:25

回答

2

也許,更好的性能是通過使用numpy.fromiter

In [30]: numpy.fromiter((tuple(row) for row in csv.reader(open('/tmp/data.csv'))), dtype='i4,i4,i4') 
Out[30]: 
array([(1, 2, 3), (4, 5, 6)], dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4')]) 

其中

$ cat /tmp/data.csv 
1,2,3 
4,5,6 

另外,我強烈建議你使用pandas:是的基於numpy,並有許多實用功能來做統計分析。

+0

謝謝,@lbolla,完美的工作! – ibictts 2012-08-02 16:16:03

4

我在嘗試創建大型400,000 x 100,000矩陣時遇到類似問題。將所有這些數據裝入一個ndarray是不可能的。

然而,我想到的大洞察是矩陣中的大多數值都是空的,因此這可以表示爲稀疏矩陣。稀疏矩陣很有用,因爲它能夠使用較少的內存來表示數據。我使用了Scipy.sparse的稀疏矩陣實現,並且我可以在內存中容納這個大矩陣。

這是我實現:

https://github.com/paolodm/Kaggle/blob/master/mdschallenge/buildmatrix.py