【问题标题】:Scipy - Multiplying large sparse matrix causes segmentation fault?Scipy - 乘以大型稀疏矩阵会导致分段错误?
【发布时间】:2015-04-28 16:12:50
【问题描述】:

我有一个大小为 444075 x 444075 的 scipy 中的 CSR 稀疏矩阵。我希望将它乘以它的转置。但是,当我执行m * m.T 时,它会导致segmentation fault 11 错误。这是内存问题吗?如果是,有没有办法为程序分配更多内存?是否有一个聪明的解决方法/黑客使用来自 scipy 的其他例程的子例程来乘以不同的方式?

【问题讨论】:

  • 如果是内存问题,它应该给出MemoryError,而不是段错误。您可以发布一些重现错误的代码吗?你用的是什么版本的 scipy?
  • 代码就是m*m.T,矩阵就是<444075x444075 sparse matrix of type '<type 'numpy.int64'>'with 3348026 stored elements in COOrdinate format>。我使用的是 15.1 版。
  • 该错误是否仅发生在特定矩阵上,还是您可以使用随机矩阵重现它?
  • 能否将您的 scipy 版本添加到问题中,好吗?我无法使用 scipy v0.13.3 或 v0.16.0.dev0+d139f48 为等效尺寸、密度、dtype 和格式的随机稀疏矩阵重现您的段错误。
  • 上一条评论中提到,我的版本是15.1。我尝试使用 scipy 的 sparse.rand 创建一个随机稀疏矩阵,但也出现了段错误。

标签: python numpy segmentation-fault scipy sparse-matrix


【解决方案1】:

解决了这个问题,原来这是一个内存问题。我在另一台机器上运行该操作并收到一个 MemoryIssue(而我的机器给出了一个段错误),当给予更多的内存时,它变成了一个“负尺寸不允许错误”,我认为这是一个整数溢出计算。

【讨论】:

  • 很高兴您解决了问题,但在我看来,段错误可能与内存问题无关。听起来整数索引在某处溢出并变为负数。如果您可以发布用于重现段错误的代码以及您看到的完整错误消息,这将对未来的读者有所帮助。两台机器上scipy的版本一样吗?
【解决方案2】:

Scipy 在稀疏 csr_matrix 中每个非零整数使用 8 个字节。使用 4GB 的可用内存和 444075x444075 的矩阵大小,不超过 0.272243315% 的矩阵元素可能是非零的。

虽然您的原始矩阵可能仅包含 3348026 个非零元素,但请记住,将矩阵与其转置相乘可能会产生更密集的结果矩阵。

如果您从 unix shell 运行应用程序,则分段错误很可能是由于进程内存不足。但是,如果你是从 python shell 运行,你应该得到一个MemoryError

python 可用的内存取决于操作系统有多少物理 RAM 和虚拟内存可用。你可以通过psutil:print psutil.phymem_usage()查看有多少内存可用。

【讨论】:

  • 非零元素的百分比为 0.0016977%。 (比例为 3348026/197202605625)。似乎足够低,不会导致内存错误;这可能是分段错误吗?这是否意味着 scipy 实现有问题?
  • 虽然m 可能很适合内存,但m * m.T 的大小将在很大程度上取决于m 的稀疏结构。例如,如果m 包含一个非零列,那么m * m.T 将是完全密集的。
猜你喜欢
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 2013-06-09
  • 2013-11-16
  • 2017-02-17
  • 2012-06-17
  • 1970-01-01
  • 2019-08-11
相关资源
最近更新 更多