首页 文章

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

提问于
浏览
67

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

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

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


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

"RuntimeError: maximum recursion depth exceeded in cmp"

然后我使用重置递归限制

sys.setrecursionlimit(50000)

但得到了“分段错误”

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

6 回答

  • 62

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

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

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

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

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

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

  • 9

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

    • 内存不足

    • Ram内存故障

    • 使用查询从数据库中获取大量数据集(如果获取的数据大小超过交换内存)

    • 错误的查询/错误代码

    • 有长循环(多次递归)

  • 48

    通过修复Python(Python段错误,谁知道!)和C实现的段错误,更新ulimit对我的Kosaraju的SCC实现起作用 .

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

    $ ulimit -s -H
    65532
    
  • 1

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


    我最近在Linux子系统Linux上使用Python 3.7的烦恼是:在具有相同Pandas库的两台机器上,一个给我 segmentation fault ,另一个报告警告 . 目前尚不清楚哪一个更新,但是"re-installing" pandas 解决了这个问题 .

    我跑在越野车上的命令 .

    conda install pandas
    

    更多细节:我运行相同的脚本(通过Git同步),两者都是带有WSL Anaconda的Windows 10机器 . 这里是截图来说明案例 . 此外,在命令行 python 将抱怨 Segmentation fault (core dumped) 的机器上,Jupyter实验室每次都只是重启内核 . 更糟糕的是,根本没有发出任何警告 .

    enter image description here

  • 0

    在RPI上升级dlib后,我遇到了这种分段错误 . 我按照上面的Shiplu Mokaddim的建议追踪了堆栈,并确定了一个OpenBLAS库 .

    由于OpenBLAS也是多线程的,因此在多线程应用程序中使用它会指数级地增加线程直到分段错误 . 对于多线程应用程序,将OpenBlas设置为单线程模式 .

    在python虚拟环境中,通过编辑告诉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

相关问题