当我使用scipy乘以两个CSR矩阵时,为什么它会消耗这么多内存?

时间:2016-01-29 14:03:03

标签: python numpy matrix scipy sparse-matrix

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

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

2 个答案:

答案 0 :(得分:1)

通过调查结果和内存消耗随着时间的推移和每次操作后我发现原因是稀疏矩阵乘法的结果。实际上<body> <?php require 'header.php';?> <div id="container" style="margin-top: 70px"><!--INSERT THE HEIGHT OF YOUR HEADER AT THE POSITION OF THE "70"--> <div="row"> <div class="col-lg-6 bg-warning"> Column 1 </div> </div> <div="row"> <div class="col-lg-6 bg-primary"> Column 2 </div> </div> </div> <?php require 'footer.php';?> </body> 中有许多零值。但M的结果是只包含50%零的矩阵。因此,结果消耗了大量内存。

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

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

答案 1 :(得分:0)

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)。

假设它没有采用密集版本,你必须研究基础算法,以了解这种内存使用是否真实。