什么导致Python分段错误?
我正在用Python实现Kosaraju的强连接组件(SCC)图搜索算法 这个程序在小数据集上运行得很好,但当我在一个超大图形(超过800000个节点)上运行它时,它会显示“分段错误” 原因可能是什么?谢谢大家!什么导致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) 但是有一个“分割错误” 相信我,这不是
其他信息: 首先,在超大数据集上运行时,我遇到了以下错误:
"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
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()