什么导致Python分段错误?

我正在Python中实现Kosaraju的强连通组件(SCC)图searchalgorithm。

该程序在小数据集上运行良好,但是当我在超大图(超过80万个节点)上运行它时,它会显示“Segmentation Fault”(分段错误)。

可能是什么原因呢? 谢谢!


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

"RuntimeError: maximum recursion depth exceeded in cmp" 

然后我使用重置recursion限制

 sys.setrecursionlimit(50000) 

但得到了“分段错误”

相信我这不是一个无限循环,它在相对较小的数据上运行正确。 程序可能耗尽了资源吗?

当一个python 扩展 (用C语言编写)尝试访问超出范围的内存时,会发生这种情况。

您可以通过以下方式进行追踪。

  • 在代码的第一行添加sys.settrace
  • 按照这个答案中的Mark所描述的使用gdb 。在命令提示符下

     gdb python (gdb) run /path/to/script.py ## wait for segfault ## (gdb) backtrace ## stack trace of the c code 

我知道你已经解决了你的问题,但是对于读这个线程的人来说,这里是答案:你必须增加操作系统为python进程分配的栈。

做到这一点的方法是依赖于操作系统。 在linux中,你可以用命令ulimit -s检查你的当前值,你可以用ulimit -s <new_value>

尝试加倍以前的值,并继续加倍,如果它不起作用,直到你find一个内存不足或内存不足。

分割故障是通用的,这有很多可能的原因

  • 记忆不足
  • RAM内存有问题
  • 使用查询从数据库中获取大数据集(获取数据的大小超过交换内存)
  • 错误的查询/错误代码
  • 有长循环(多recursion)

更新ulimit为我的Kosaraju的SCC实现工作,修复了Python(Python segfault ..谁知道!)和C ++实现上的segfault。

对于我的MAC,我发现了可能的最大通过:

 $ ulimit -s -H 65532