什么是序列化大型scipy稀疏矩阵的最佳方法?

时间:2014-07-25 02:15:18

标签: python numpy scipy hdf5 pytables

我有一个大的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

那我该怎么办?

2 个答案:

答案 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

这些格式都不支持同一组操作,但格式之间的转换很简单。