我正在尝试使用大型scipy稀疏矩阵供以后使用。我收到了这个错误:
File "tfidf_scikit.py", line 44, in <module>
pickle.dump([trainID, trainX, trainY], fout, protocol=-1)
SystemError: error return without exception set
trainX
是大型稀疏矩阵,另外两个列表是6mil元素长。
In [1]: trainX
Out[1]:
<6034195x755258 sparse matrix of type '<type 'numpy.float64'>'
with 286674296 stored elements in Compressed Sparse Row format>
此时,Python内存使用量为4.6GB,我的笔记本电脑上有16GB内存。
我认为我遇到了cPickle的已知内存错误,它不能处理太大的对象。我也试过marshal
,但我认为它不适用于scipy矩阵。有人可以提供解决方案,最好是一个关于如何加载和保存这个的例子吗?
Python 2.7.5
Mac OS 10.9
谢谢。
答案 0 :(得分:1)
我遇到了这个带有多GB Numpy矩阵的问题(Ubuntu 12.04和Python 2.7.3 - 似乎是这个问题:https://github.com/numpy/numpy/issues/2396)。
我使用numpy.savetxt()/ numpy.loadtxt()解决了这个问题。压缩矩阵在保存时添加.gz文件扩展名。
由于我也只有一个矩阵,所以我没有调查HDF5的使用。
答案 1 :(得分:0)
两个numpy.savetxt
(仅适用于数组,而不是稀疏矩阵)和sklearn.externals.joblib.dump
(酸洗,速度慢,内存使用速度慢)在Python 2.7上对我不起作用。
相反,我使用scipy.sparse.save_npz
并且它工作得很好。请注意,它仅适用于csc
,csr
,bsr
,dia
或coo
矩阵。