Python 大型稀疏矩阵点积计算中的记忆误差

Python 大型稀疏矩阵点积计算中的记忆误差,python,matrix,scipy,sparse-matrix,matrix-multiplication,Python,Matrix,Scipy,Sparse Matrix,Matrix Multiplication,假设以下情况:我得到了一个双模网络的邻接矩阵,其中一个维度表示一些项(post)和出现在每个项下的其他标记。现在我想折叠这两个模式的网络,以得到一个项目对项目关系的单模式网络,其中每个链接的值表示两个项目的共享标记的数量。可通过以下简单的矩阵乘法实现: 或在代码中: 从scipy.sparse导入csr\u矩阵,保存\u npz,加载\u npz #负荷矩阵 tpm=csr矩阵(加载npz('tag\u post\u matrix.npz')) #计算点积 cn=tpm.transpose()

假设以下情况:我得到了一个双模网络的邻接矩阵,其中一个维度表示一些项(post)和出现在每个项下的其他标记。现在我想折叠这两个模式的网络,以得到一个项目对项目关系的单模式网络,其中每个链接的值表示两个项目的共享标记的数量。可通过以下简单的矩阵乘法实现:

或在代码中:

从scipy.sparse导入csr\u矩阵,保存\u npz,加载\u npz
#负荷矩阵
tpm=csr矩阵(加载npz('tag\u post\u matrix.npz'))
#计算点积
cn=tpm.transpose().dot(tpm)
#保存结果
save_npz('content_network_abs.npz',cn)
这会在运行一段时间后引发此错误:

---------------------------------------------------------------------------
MemoryError回溯(上次最近调用)
在()
---->1 cn=tpm.transpose().dot(tpm)
2保存npz(扩展('content\u network\u abs.npz'),cn)
3.
/opt/anaconda/lib/python3.7/site-packages/scipy/sparse/base.py in dot(self,other)
359
360         """
-->361返回自我*其他
362
363 def电源(自身,n,数据类型=无):
/opt/anaconda/lib/python3.7/site-packages/scipy/sparse/base.py in\uuuuuuuuu muluuuuuuuuuu(self,other)
477如果self.shape[1]!=其他.shape[0]:
478提升值错误(“维度不匹配”)
-->479返回自多稀疏矩阵(其他)
480
481#如果它是一个列表或其他什么,请将其视为矩阵
/opt/anaconda/lib/python3.7/site-packages/scipy/sparse/compressed.py in_mul_sparse_矩阵(self,other)
500最大值=nnz)
501 indptr=np.asarray(indptr,dtype=idx\u dtype)
-->502索引=np.empty(nnz,dtype=idx_dtype)
503 data=np.empty(nnz,dtype=upcast(self.dtype,other.dtype))
504
记忆错误:
我在执行过程中监控RAM,没有任何异常观察(我有足够的内存:~1TB)

初始矩阵有大约24000000个非零项(非常稀疏),我希望得到的矩阵也非常稀疏

我对这个主题是否有一个普遍的误解,或者代码中是否有bug


提前感谢!

尝试增加虚拟内存。1.5x额外的虚拟机对我来说效果更好。

您的系统和/或Python是32位还是64位?计算分两步完成。一步确定结果的大小。使用该信息初始化属性数组,然后填充它们。
nnz
是结果将包含。
inidices
是保存列索引的数组,每个非零项一个。
tpm
的稀疏度是多少?您希望结果的稀疏度更高还是更低?@PhilipZou我正在Ubuntu 18上运行一个64位版本的Python 3.7。04@hpaulj我希望结果矩阵的稀疏性比OP提到1TB的RAM。没有迹象表明这是一个虚拟机。因此调整VM大小可能是不可能的。我不是说虚拟机。1TB是物理RAM。调整windows或mac虚拟内存应该会有帮助。