什么原因导致Python分段错误?

xia*_*ong 70 python segmentation-fault large-data

我正在用Python实现Kosaraju的强连接组件(SCC)图搜索算法.

该程序在小数据集上运行良好,但是当我在超大图(超过800,000个节点)上运行它时,它会显示"Segmentation Fault".

可能是什么原因造成的?谢谢!


附加信息:首先,我在超大型数据集上运行时出现此错误:

"RuntimeError: maximum recursion depth exceeded in cmp"
Run Code Online (Sandbox Code Playgroud)

然后我使用重置递归限制

sys.setrecursionlimit(50000)
Run Code Online (Sandbox Code Playgroud)

但得到了"分段错误"

相信我,它不是一个无限循环,它在相对较小的数据上运行正确.该计划有可能耗尽资源吗?

Shi*_*dim 66

当python 扩展(用C编写)试图访问超出范围的内存时会发生这种情况.

您可以通过以下方式跟踪它.

  • 在OSX Sierra上,gdb被lldb取代 (3认同)
  • 谢谢,但我的代码是纯python,它有所作为吗? (2认同)

Dav*_*ide 48

我知道你已经解决了你的问题,但对于阅读这个帖子的其他人来说,这就是答案:你必须增加操作系统为python进程分配的堆栈.

这样做的方法是依赖于操作系统.在linux中,您可以使用命令检查ulimit -s当前值,然后可以使用它来增加它ulimit -s <new_value>

尝试将之前的值加倍并继续加倍,如果它不起作用,直到找到一个执行或耗尽内存的值.

  • 请注意,ulimit值仅针对其执行的特定shell进行了修改,因此您不会意外地修改整个系统的值 (3认同)
  • 我这样做并最终得到 ulimit -s 16384,但是运行后我仍然遇到分段错误。 (2认同)

小智 14

分段错误是一个通用错误,有很多可能的原因:

  • 记忆不足
  • Ram内存故障
  • 使用查询从数据库中获取大量数据集(如果获取的数据大小超过交换内存)
  • 错误的查询/错误代码
  • 有长循环(多次递归)


Roc*_*ock 6

通过修复 Python(Python 段错误..谁知道!)和 C++ 实现上的段错误,更新 ulimit 适用于我的 Kosaraju 的 SCC 实现。

对于我的 Mac,我通过以下方式找到了可能的最大值:

$ ulimit -s -H
65532
Run Code Online (Sandbox Code Playgroud)


lli*_*eng 5

谷歌搜索找到了我这篇文章,并没有看到下面讨论的“个人解决方案”。


我最近对 ​​Linux 的 Windows 子系统上的 Python 3.7 感到恼火的是:在两台具有相同 Pandas 库的机器上,一台向我发出警告segmentation fault,另一台报告警告。不清楚哪一个更新,但“重新安装”pandas解决了问题。

我在有缺陷的机器上运行的命令。

conda install pandas
Run Code Online (Sandbox Code Playgroud)

更多详细信息:我运行相同的脚本(通过 Git 同步),并且都是带有 WSL + Anaconda 的 Windows 10 计算机。下面是截图来说明这一点。此外,在命令行python会抱怨的机器上Segmentation fault (core dumped),Jupyter 实验室每次都会简单地重新启动内核。更糟糕的是,根本没有发出任何警告。

在此输入图像描述


几个月后更新:我不再在 Windows 计算机上托管 Jupyter 服务器。我现在在 Windows 上使用 WSL 来获取 Linux 服务器上打开的远程端口,并在远程 Linux 计算机上运行我的所有作业。好几个月来我从未遇到过任何执行错误:)