我有一个大小为 444075 x 444075 的 CSR 稀疏矩阵。我希望将其乘以它的转置。但是,当我m * m.T
时,它会导致segmentation fault 11
错误。这是内存问题吗,如果是,有没有办法为程序分配更多内存?有没有一个聪明的解决方法/黑客使用子例程从 scipy 其他例程乘以不同的方式?
解决了问题,原来这是一个内存问题。我在另一台机器上运行该操作并收到 MemoryIssue(而我的机器给出段错误),当给予更多内存时,它会变成"不允许的负维度错误",我认为这是计算中的整数溢出。
Scipy 在稀疏csr_matrix中为每个非零整数使用 8 个字节。如果 4GB 可用内存和 444075x444075 的矩阵大小,则不超过 0.272243315% 的矩阵元素可能不为零。
虽然原始矩阵可能只包含3348026个非零元素,但请记住,将矩阵与其转置相乘可能会生成填充更密集的结果矩阵。
如果从 unix shell 运行应用程序,则分段错误很可能是由于进程内存不足造成的。但是,如果您从python shell运行,则应获得MemoryError
。
取决于操作系统可用的物理 RAM 和虚拟内存量。您可以使用 psutil: print psutil.phymem_usage()
检查有多少内存可用。