保存大Scipy稀疏矩阵

时间:2013-11-05 16:45:25

标签: python scipy sparse-matrix pickle

我正在尝试使用大型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

谢谢。

2 个答案:

答案 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并且它工作得很好。请注意,它仅适用于csccsrbsrdiacoo矩阵。