2012-08-02 59 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