我有一个巨大的稀疏矩阵。我想将密集等效文件保存到文件系统中。
问题是我的机器的内存限制。
我最初的想法是:
huge_sparse_matrix
ndarray
转换为np.asarray(huge_sparse_matrix)
但是,在步骤1
,Python会引发MemoryError
。
我认为一种可能的方法是:
但是怎么做?
答案 0 :(得分:0)
你可以使用scipy.sparse函数读取稀疏矩阵,然后将其转换为numpy,请参阅此处的文档 scipy.sparse docs and examples
答案 1 :(得分:0)
我认为np.asarray()并不是你正在寻找的功能。 您可以尝试使用SciPy矩阵格式cco_matrix()(坐标格式化矩阵)。 scipy.sparse.coo_matrix
这种格式允许在非常小的内存中保存巨大的稀疏矩阵。 此外,还有许多数学scipy函数也适用于这种矩阵格式。
此格式的矩阵表示基本上是三个列表:
希望有所帮助,欢呼
答案 2 :(得分:0)
内存问题的常见和最直接的答案是:不要创建对象,使用迭代器或生成器。
如果我理解正确,你有一个稀疏矩阵,你想把它转换成一个列表表示。这是一个示例代码:
def iter_sparse_matrix ( m, d1, d2 ):
for i in xrange(d1):
for j in xrange(d2):
if m[i][j]:
yield ( i, j, m[i][j] )
dense_array = list(iter_sparse_matrix(m, d1, d2))
您可能还想看一下:
答案 3 :(得分:0)
如果我没错,你的问题是稀疏矩阵的dense
不适合你的记忆,因此,你无法保存它
我建议您使用HDF5。 HDF5处理磁盘中的大数据,仅在需要时将其传递到内存。
我这样的事情应该有效:
import h5py
data = # your sparse matrix
cx = data.tocoo() # coo sparse representation
这将在磁盘中创建(零)数据矩阵。
f = h5py.File('dset.h5','w')
dataset = f.create_dataset("data", data.shape)
使用稀疏数据填充矩阵:
dataset[cx.row, cx.col] = cx.data
添加您想要的任何修改数据集:
dataset[something, something] = something
最后,保存它:
file.close()
HDF5的工作方式我认为非常适合您的需求。矩阵始终存储在磁盘中,因此它不需要内存,但是,您可以使用它,就好像它是标准的numpy矩阵(索引,切片,np.(..)
操作等)和h5py驱动程序会将你需要的矩阵部分发送到内存中(除非你特别需要data[:, :]
之类的内容,否则不会发送整个矩阵。)
PS:我假设您的稀疏矩阵是scipy
的稀疏矩阵之一。如果没有从您的矩阵表示提供的那些替换cx.row
,cx.col
和cx.data
(应该是类似的)。