4

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

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

3 回答 3

5

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

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

这是我的实现:

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

于 2012-08-02T15:15:57.270 回答
3

可能,更好的性能是通过使用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并具有许多实用功能来进行统计分析。

于 2012-08-02T15:18:37.513 回答
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。然后内存将占用与转储磁盘文件相同的空间。

于 2020-10-05T21:42:56.010 回答