保存大规模的Scipy稀疏矩阵

3
我正在尝试cPickle一个大的scipy稀疏矩阵以供以后使用。但是我遇到了以下错误:
  File "tfidf_scikit.py", line 44, in <module>
    pickle.dump([trainID, trainX, trainY], fout, protocol=-1)
SystemError: error return without exception set

trainX 是一个大型稀疏矩阵,另外两个是长度为6百万的列表。

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的RAM。

我认为我遇到了一个已知的cPickle内存bug,它不能处理太大的对象。我也尝试过marshal,但我不认为它适用于scipy矩阵。有人能提供一个解决方案吗?最好能提供一个加载和保存的示例。

Python版本:2.7.5

Mac OS版本:10.9

谢谢。


1
我在稀疏矩阵和pickle方面遇到了同样的问题,不认为这是与链接的重复问题。 - Ekgren
2个回答

1

我遇到了一个关于多GB的Numpy矩阵的问题(Ubuntu 12.04和Python 2.7.3 - 看起来是这个问题:https://github.com/numpy/numpy/issues/2396)。

我使用了numpy.savetxt() / numpy.loadtxt()解决了这个问题。在保存时,将矩阵压缩并添加.gz文件扩展名。

由于我只有一个单独的矩阵,所以没有调查使用HDF5的方法。


0

对于数组(而不是稀疏矩阵),numpy.savetxt 和使用 pickle 的 sklearn.externals.joblib.dump 都无法在 Python 2.7 上工作,而且速度非常慢且消耗内存。

相反,我使用了 scipy.sparse.save_npz ,它完美地解决了我的问题。请记住,它仅适用于 csccsrbsrdiacoo 矩阵。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接