2012-04-05 162 views
49

我正在Python中实现Kosaraju的强连通组件(SCC)图搜索算法。什么导致Python分段错误?

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

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


附加信息: 首先我上了超大规模数据集运行时,此错误:

"RuntimeError: maximum recursion depth exceeded in cmp" 

然后我重新使用

sys.setrecursionlimit(50000) 

递归限制,但有一个'Segmentation fault'

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

+9

可能是你可以看看[CrashingPython(http://wiki.python.org/moin/CrashingPython) – Abhijit 2012-04-05 20:32:46

+2

这是在纯Python中运行还是使用C扩展模块?如果它是纯Python,那么它就是一个错误,并且恭喜你。如果您使用的是c模块,那么段错误可能来自那里。 – aaronasterling 2012-04-05 20:32:54

+0

它是纯粹的蟒蛇。该程序在相对较小的数据集上运行良好,并使我认为代码是正确的。 – xiaolong 2012-04-05 20:44:44

回答

54

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

您可以通过以下方式追踪它。

  • 在代码的第一行添加sys.settrace。如马克描述this answer ..在命令提示符下
  • 使用gdb

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

谢谢,但我的代码是纯python,它是否有所作为? – xiaolong 2012-04-05 20:47:35

+0

检查你正在使用哪些python模块?有些模块是用Python编写的,其他模块是用C语言编写的。我想你需要报告一个错误。 – 2012-04-05 20:49:28

+0

类似的,也很有帮助:stdlib的[trace](http://pymotw.com/2/trace/)模块帮助我在登台服务器上达到分段错误的底部,而不需要安装新的依赖关系,也不需要修改码。 – hangtwenty 2015-05-06 02:53:49

34

我知道你已经解决您的问题,但对于其他人阅读此线程,这里就是答案:您必须增加操作系统为python进程分配的堆栈。

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

尝试增加它加倍以前的值,然后继续,如果它不能正常工作加倍,直到找到一个没有或耗尽内存。

+0

另一种检查你是否遇到u​​limit max的好方法是运行'lsof'并使用'grep'或'wc -l'来跟踪所有内容。 – cdated 2013-02-05 17:57:09

+0

我同意。通过修复Python和C++实现中的segfault,这实际上对我的Kosaraju的SCC实现起作用。
对于我的MAC,我发现通过最大可能: – Rock 2016-11-18 03:59:36

+2

注意,使用ulimit值,因为它是在执行特定的壳只修改了,这样你就不会意外修改数值为你的整个系统 – 2016-12-04 06:40:53

8

分割故障是通用的一个,这是你的

  • 低内存
  • 故障的RAM内存
  • 抓取庞大的数据从设置数据库使用查询(获取数据的大小超过许多可能的原因交换MEM)
  • 错误的查询/缺陷代码
  • 具有长循环(多递归)
0

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

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

$ ulimit -s -H 
65532