【问题标题】:What's the best way to serialize a large scipy sparse matrix?序列化大型 scipy 稀疏矩阵的最佳方法是什么?
【发布时间】:2014-09-16 19:04:11
【问题描述】:

我有一个大的 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: Object dtype dtype('O') has no native HDF5 equivalent

那我该怎么办?

【问题讨论】:

标签: python numpy scipy hdf5 pytables


【解决方案1】:

不幸的是,酸洗的内存效率非常低。我建议访问稀疏矩阵的底层数据数组属性,并以有效的方式存储这些属性,例如 hdf5。从行/列/数据向量的三元组重构稀疏矩阵应该很容易。

【讨论】:

  • 所以你建议定义一个 M2 使得 M2 = M.tocsr() 然后使用这里的解决方案:stackoverflow.com/questions/11129429/…
  • 使用 csr 或 coo 或其他不太重要的东西。可以访问和存储每种稀疏格式的底层数据数组,因此将链接到的示例修改为您选择的任何稀疏格式应该不会太难。但是,是的,这是一般的想法。
  • 如果您总是需要将整个矩阵加载回内存,这种方法效果很好。如果您需要能够检索矩阵的切片(例如检索行的子集),hdf5 可能会很慢,因为slow random access 这是 csr 和 csc 矩阵所必需的,因为这些格式的数据不容易存储在切片方式。
【解决方案2】:

这取决于矩阵中实际存储了多少数据。序列化前有没有看转换矩阵类型?

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-16
    • 2017-02-17
    • 2014-08-25
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多