Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么导致Python分段错误?_Python_Segmentation Fault_Large Data - Fatal编程技术网

什么导致Python分段错误?

什么导致Python分段错误?,python,segmentation-fault,large-data,Python,Segmentation Fault,Large Data,我正在用Python实现Kosaraju的强连接组件(SCC)图搜索算法 这个程序在小数据集上运行得很好,但当我在一个超大图形(超过800000个节点)上运行它时,它会显示“分段错误” 原因可能是什么?谢谢大家! 其他信息: 首先,在超大数据集上运行时,我遇到了以下错误: "RuntimeError: maximum recursion depth exceeded in cmp" 然后我使用 sys.setrecursionlimit(50000) 但是有一个“分割错误” 相信我,这不是

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

这个程序在小数据集上运行得很好,但当我在一个超大图形(超过800000个节点)上运行它时,它会显示“分段错误”

原因可能是什么?谢谢大家!


其他信息: 首先,在超大数据集上运行时,我遇到了以下错误:

"RuntimeError: maximum recursion depth exceeded in cmp"
然后我使用

sys.setrecursionlimit(50000)
但是有一个“分割错误”


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

当python扩展(用C编写)试图访问无法访问的内存时,就会发生这种情况

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

  • 在代码的第一行添加
  • 按照中的标记使用
    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


尝试将上一个值加倍,如果不起作用,则继续加倍,直到找到一个不起作用或内存不足的值。

分段故障是一个常见故障,原因可能有很多:

  • 低内存
  • 故障Ram存储器
  • 使用查询从数据库中获取大量数据集(如果获取的数据大小大于swap mem)
  • 错误的查询/错误代码
  • 具有长循环(多重递归)

  • < U/U> < P>更新ULIMIT,通过在Python(Python StEnguls.WHO!)和C++实现上修复Sebug来实现我的KasalaJu的SCC实现。p> 对于我的MAC,我通过以下途径找到了可能的最大值:

    $ ulimit -s -H
    65532
    

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


    我最近在Windows Subsystem for Linux上使用Python 3.7的烦恼在于:在具有相同Pandas库的两台机器上,一台给我
    分段错误
    ,另一台报告警告。目前尚不清楚哪一个较新,但“重新安装”熊猫解决了这个问题

    我在小车上运行的命令

    conda install pandas
    
    更多细节:我运行的是相同的脚本(通过Git同步),都是带有WSL+Anaconda的Windows10机器。下面是一些截图来说明问题。另外,在命令行
    python
    将抱怨
    分段错误(内核转储)
    的机器上,Jupyter lab只需每次重新启动内核。更糟糕的是,根本没有发出任何警告



    几个月后更新:我停止在Windows机器上托管Jupyter服务器。我现在使用Windows上的WSL获取Linux服务器上打开的远程端口,并在远程Linux机器上运行我的所有作业。我已经好几个月没有遇到过任何执行错误:)

    在升级RPI上的dlib后,我遇到了此分段错误。 我按照上面Shiplu Mokaddim的建议对堆栈进行了跟踪,并将其放置在OpenBLAS库中

    由于OpenBLAS也是多线程的,因此在多线程应用程序中使用它将使线程成倍增加,直到出现分段错误。对于多线程应用程序,请将OpenBlas设置为单线程模式

    在python虚拟环境中,通过编辑以下内容,告诉OpenBLAS仅使用单个线程:

        $ workon <myenv>
        $ nano .virtualenv/<myenv>/bin/postactivate
    
    重新启动后,我能够在rpi3b上运行我的所有图像识别应用程序,而之前这些应用程序正在崩溃

    参考:
    看起来您的堆栈内存不足。你可能想增加它,正如戴维德所说。要在python代码中执行此操作,您需要使用线程运行“main()”:

    def main():
        pass # write your code here
    
    sys.setrecursionlimit(2097152)    # adjust numbers
    threading.stack_size(134217728)   # for your needs
    
    main_thread = threading.Thread(target=main)
    main_thread.start()
    main_thread.join()
    

    来源:。用PyPy运行它有点麻烦。

    可能您可以看看它是在纯Python中运行还是在使用C扩展模块?如果它是纯Python,那么它就是一个bug,恭喜你。如果您使用的是c模块,那么segfault可能来自于此,它是纯python。该程序在相对较小的数据集上运行得非常好,这让我认为代码是正确的。根据Python文档:根据Python文档:可能的最高限制取决于平台。当用户有需要深度递归的程序和支持更高限制的平台时,可能需要将限制设置得更高。这应该小心完成,因为过高的限制可能会导致崩溃。::您没有指定操作系统。对崩溃的引用可能意味着操作系统出现分段故障。尝试一个较小的堆栈。但是IIRC您正在使用的算法将rntire SSC放在堆栈上,因此您可能会耗尽堆栈。谢谢,但我的代码是纯python,这有区别吗?检查您正在使用哪些python模块?有些模块是用python编写的,有些是用C编写的。我想你需要报告一个bug。类似的,也很有帮助:stdlib的模块只是帮助我找到了登台服务器上分段错误的根源,没有安装新的依赖项,也没有修改代码。在OSX Sierra上,gdb被lldbOn OS X取代。另一个检查您是否遇到ulimit max的好方法是运行
    lsof
    ,并使用
    grep
    wc-l
    跟踪一切。我同意。这实际上为我的KasalaJua的SCC实现工作,通过在Python和C++实现上修复SeaFi断层。br/>对于我的MAC,我通过以下方式找到了可能的最大值:请注意,ulimit值仅针对它在其中执行的特定shell进行了修改,这样您就不会意外地修改整个系统的值。我这样做了,最终得到了ulimit-s 16384,但是在运行之后,我仍然得到了一个分段错误。@SreehariR请尝试增加
    def main():
        pass # write your code here
    
    sys.setrecursionlimit(2097152)    # adjust numbers
    threading.stack_size(134217728)   # for your needs
    
    main_thread = threading.Thread(target=main)
    main_thread.start()
    main_thread.join()