是什么原因导致一个Python分段错误?是什么原因导致一个Python分段错误?(What caus

2019-05-13 11:27发布

我采取Kosaraju的强连通分量(SCC)在Python图搜索算法。

该程序运行在小数据集很大,但是当我在一个超级大图(超过80万个节点)运行它,它说:“段错误”。

什么可能是它的原因是什么? 谢谢!


其他信息:一是对超大规模数据集运行时,我得到这个错误:

"RuntimeError: maximum recursion depth exceeded in cmp"

然后,我使用重置递归限制

sys.setrecursionlimit(50000)

但有一个“分段故障”

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

Answer 1:

这发生在一个Python 扩展 (用C语言编写)试图访问一个内存可望而不可及。

你可以跟踪它在以下几个方面。

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

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


Answer 2:

我知道你已经解决了您的问题,但对于其他人阅读此线程,这里是答案:你要提高你的操作系统分配的Python进程的堆栈。

要做到这一点,取决于操作系统。 在Linux中,可以使用以下命令检查ulimit -s您的当前值和您可以增加它ulimit -s <new_value>

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



Answer 3:

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

  • 记忆不足
  • 故障RAM内存
  • 取出由分贝使用查询一个巨大的数据集(如果取的数据的大小大于交换MEM更多)
  • 错误的查询/ bug的代码
  • 具有长循环(多递归)


Answer 4:

Updating the ulimit worked for my Kosaraju's SCC implementation by fixing the segfault on both Python (Python segfault.. who knew!) and C++ implementations.

For my MAC, I found out the possible maximum via :

$ ulimit -s -H
65532


Answer 5:

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


我最近在Windows子系统用于Linux的Python 3.7的烦恼是:在两台机器上使用相同的熊猫库,一个给了我segmentation fault和其他报告警告。 目前尚不清楚哪一个是新的,但“重新安装” pandas解决了这个问题。

命令我的车机上运行。

conda install pandas

更多细节:我正在运行相同的脚本(通过Git的同步),两者都是Windows 10机器WSL +蟒蛇。 何去何从截图的情况下作出。 同时该机在那里命令行上python会抱怨Segmentation fault (core dumped) ,Jupyter实验室只需重新启动内核每一次。 更糟糕的是,在所有被给予警告。



Answer 6:

我是在RPI升级后DLIB遇到此分段错误。 我tracebacked堆栈由Shiplu Mokaddim上述建议,并在一个OpenBLAS库解决。

由于OpenBLAS也是多线程的,用它在一个muilt线程应用程序将成倍繁殖线程,直到段故障。 对于多线程应用程序,设置OpenBlas为单线程模式。

在蟒蛇的虚拟环境,告诉OpenBLAS通过编辑只使用一个线程:

    $ workon <myenv>
    $ nano .virtualenv/<myenv>/bin/postactivate

并添加:

    export OPENBLAS_NUM_THREADS=1 
    export OPENBLAS_MAIN_FREE=1

重新启动后,我能够运行在所有rpi3b我的图像识别应用了以前崩溃了。

参考: https://github.com/ageitgey/face_recognition/issues/294



文章来源: What causes a Python segmentation fault?