为什么我用scipy相乘两个CSR矩阵会占用这么多内存?

Why does it consume so much memory when I multiply two CSR matrices using scipy?

我使用了一个 800,000x350,000 矩阵的 Scipy CSR representation,假设它是 M。我想计算点积 M * M[0:x].T。现在,根据 x 的值,内存消耗会增加。 x=1 不明显,但如果 x=2000 乘法过程需要大约 8 GB 的 RAM。

我想知道当我计算这个产品时会发生什么,以及为什么与存储稀疏矩阵(大约 30Mb)相比它需要这么多内存。矩阵是否为乘法展开?

csr矩阵乘法的编译核心在

https://github.com/scipy/scipy/blob/0cff7a5fe6226668729fc2551105692ce114c2b3/scipy/sparse/sparsetools/csr.h

从第 500 行开始,csr_matmat... 函数。它包括对它所基于的数学论文的引用。

A*B调用的Python代码是__mul__。查看 csr 矩阵的版本以确保它正在调用 self._mul_sparse_matrix,您将看到最终调用 self.format + '_matmat_pass1'(和 pass2)。

假设它不求助于密集版本,您将必须研究底层算法以了解这种内存使用是否现实。

通过调查随着时间的推移和每次操作后的结果和内存消耗,我发现原因是稀疏矩阵乘法的结果。 M 中确实有很多零值。但是 M*M.T 的结果是一个仅包含 50% 零的矩阵。因此结果消耗了大量内存。

示例:假设 M 的每个行向量在同一索引处有一个 none-零字段,但除此之外是 稀疏。那么 M*M.T 的结果根本就不会是 sparse(没有零值)。

尽管如此,感谢您的帮助。