加载一个巨大的稀疏数组并将其保存为密集数组

时间:2015-05-21 14:02:13

标签: python numpy out-of-memory sparse-matrix

我有一个巨大的稀疏矩阵。我想将密集等效文件保存到文件系统中。

问题是我的机器的内存限制。

我最初的想法是:

  1. huge_sparse_matrix
  2. ndarray转换为np.asarray(huge_sparse_matrix)
  3. 分配值
  4. 将其保存回文件系统
  5. 但是,在步骤1,Python会引发MemoryError

    我认为一种可能的方法是:

    1. 创建一个密集阵列
    2. 从相应的稀疏
    3. 中分配值
    4. 将密集数组块保存回文件系统
    5. 重复1-3
    6. 但是怎么做?

4 个答案:

答案 0 :(得分:0)

你可以使用scipy.sparse函数读取稀疏矩阵,然后将其转换为numpy,请参阅此处的文档 scipy.sparse docs and examples

答案 1 :(得分:0)

我认为np.asarray()并不是你正在寻找的功能。 您可以尝试使用SciPy矩阵格式cco_matrix()(坐标格式化矩阵)。 scipy.sparse.coo_matrix

这种格式允许在非常小的内存中保存巨大的稀疏矩阵。 此外,还有许多数学scipy函数也适用于这种矩阵格式。

此格式的矩阵表示基本上是三个列表:

  • 行:行的索引
  • col:列的索引
  • 数据:此位置的值

希望有所帮助,欢呼

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

您可能还想看一下:

http://cvxopt.org/userguide/matrices.html#sparse-matrices

答案 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.rowcx.colcx.data(应该是类似的)。