什么导致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