簡體   English   中英

Numpy 數組占用太多內存

[英]Numpy array taking too much memory

我正在通過 numpy.loadtxt 將一個 csv 文件加載到一個 numpy 數組中。 我的數據有大約 100 萬條記錄和 87 列。 雖然 object.nbytes 只有 177159666 字節,但它實際上需要更多的內存,因為我在使用 scikit-learn 訓練決策樹時得到“MemoryError”。 此外,在讀取數據后,我系統中的可用內存減少了 1.8 gigs。 我正在使用 3 演出內存的 linux 機器上工作。 那么 object.nbytes 是否返回 numpy 數組的實際內存使用情況?

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

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

然而,我想出的重要見解是矩陣中的大多數值都是空的,因此可以將其表示為稀疏矩陣。 稀疏矩陣很有用,因為它能夠使用較少的內存來表示數據。 我使用了 Scipy.sparse 的稀疏矩陣實現,並且我能夠在內存中適應這個大矩陣。

這是我的實現:

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

可能更好的性能是使用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並且具有許多實用函數來進行統計分析。

我剛剛遇到了同樣的問題:

我保存的 .npy 文件是 752M(在磁盤上),並且 arr.nbytes = 701289568(~669M); 但是 np.load 占用 2.7g 內存,即實際所需內存的 4 倍

https://github.com/numpy/numpy/issues/17461

事實證明:

數據數組包含混合(少量)字符串和(大量)數字。

但是這些 8 字節位置中的每一個都指向一個 python 對象,該對象至少需要 24 個字節加上數字或字符串的空間。

因此,在內存中(8 字節指針 + 24 字節)~= 文件中大部分 8 字節(雙數)的 4 倍。

注意: np.save() 和 np.load() 不是對稱的:

-- np.save() 將數字類型保存為標量數據,因此磁盤文件大小與用戶心目中的數據大小一致,且較小

-- np.load() 將數字類型加載為 PyObject,並將內存使用量膨脹為用戶預期的 4 倍。

這對於其他文件格式也是一樣的,例如 csv 文件。

結論:不要在 np 數組中使用混合類型(字符串作為 np.object 和 np.numbers)。 使用同構數字類型,例如 np.double。 然后內存將占用與轉儲磁盤文件大致相同的空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM