Numpy数组占用太多内存

时间:2012-08-02 14:53:01

标签: python numpy

我正在通过numpy.loadtxt将csv文件加载到numpy数组中。我的数据有大约100万条记录和87列。虽然object.nbytes只有177159666字节,但它实际上需要更多的meomory,因为我得到了#MemoryError'使用scikit-learn训练决策树。此外,在读取数据后,我系统中的可用内存减少了1.8 gig。我正在使用3 gig内存的linux机器上工作。那么object.nbytes是否返回numpy数组的实际内存使用量?

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

3 个答案:

答案 0 :(得分:4)

我在尝试创建一个400,000 x 100,000的大型矩阵时遇到了类似的问题。将所有数据拟合成ndarray是不可能的。

然而,我提出的最大的见解是矩阵中的大多数值都是空的,因此这可以表示为稀疏矩阵。稀疏矩阵很有用,因为它能够使用更少的内存来表示数据。我使用了Scipy.sparse的稀疏矩阵实现,我能够将这个大矩阵放在内存中。

这是我的实施:

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

答案 1 :(得分: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并且具有许多实用功能来进行统计分析。

答案 2 :(得分:0)

我只是遇到了同样的问题:

我保存的.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。然后,内存将占用与转储磁盘文件相同的空间。