为什么我用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
矩阵乘法的编译核心在
从第 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(没有零值)。
尽管如此,感谢您的帮助。
我使用了一个 800,000x350,000 矩阵的 Scipy CSR representation,假设它是 M
。我想计算点积 M * M[0:x].T
。现在,根据 x
的值,内存消耗会增加。 x=1
不明显,但如果 x=2000
乘法过程需要大约 8 GB 的 RAM。
我想知道当我计算这个产品时会发生什么,以及为什么与存储稀疏矩阵(大约 30Mb)相比它需要这么多内存。矩阵是否为乘法展开?
csr
矩阵乘法的编译核心在
从第 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(没有零值)。
尽管如此,感谢您的帮助。