我有一个大的scipy稀疏矩阵,它占据了我整个系统内存的90%。我想将它保存到磁盘,因为构建矩阵需要几个小时......
我试过cPickle,但这会导致重大内存爆炸......
import numpy as np
from scipy.sparse import lil_matrix
import cPickle
dim = 10**8
M = lil_matrix((dim, dim), dtype=np.float)
with open(filename, 'wb') as f:
cpickle.dump(M, f) # leads to a major memory explosion, presumably there is lots of copying
虽然HDF5不喜欢数据类型:TypeError:对象dtype dtype(' O')没有等效的原生HDF5
那我该怎么办?
答案 0 :(得分:5)
不幸的是,酸洗效率非常低。我建议访问稀疏矩阵的基础数据数组属性,并以有效的方式存储它们,例如hdf5。从行/列/数据向量的三元组重构稀疏矩阵应该很容易。
答案 1 :(得分:3)
这取决于矩阵中实际存储的数据量。您是否考虑过在序列化之前转换矩阵类型?
LIL矩阵不是您可用的内存效率最高的稀疏矩阵。您可以在酸洗之前转换为DIA,COO或DOK。
例如:
In [43]: dim = 10**6
In [44]: M = lil_matrix((dim, dim), dtype=np.float)
In [45]: for ii in range(10000):
M[np.random.uniform(0,dim),np.random.uniform(0,dim)] = 1
In [46]: len(cPickle.dumps(M.todok()))
Out[46]: 1256302
In [47]: len(cPickle.dumps(M.tocoo()))
Out[47]: 557691
# compared to
In [48]: len(cPickle.dumps(M))
Out[48]: 23018393
这些格式都不支持同一组操作,但格式之间的转换很简单。