xia*_*ong 70 python segmentation-fault large-data
我正在用Python实现Kosaraju的强连接组件(SCC)图搜索算法.
该程序在小数据集上运行良好,但是当我在超大图(超过800,000个节点)上运行它时,它会显示"Segmentation Fault".
可能是什么原因造成的?谢谢!
附加信息:首先,我在超大型数据集上运行时出现此错误:
"RuntimeError: maximum recursion depth exceeded in cmp"
Run Code Online (Sandbox Code Playgroud)
然后我使用重置递归限制
sys.setrecursionlimit(50000)
Run Code Online (Sandbox Code Playgroud)
但得到了"分段错误"
相信我,它不是一个无限循环,它在相对较小的数据上运行正确.该计划有可能耗尽资源吗?
Shi*_*dim 66
当python 扩展(用C编写)试图访问超出范围的内存时会发生这种情况.
您可以通过以下方式跟踪它.
sys.settrace在代码的第一行添加.在此答案中使用Markgdb所描述的..在命令提示符下
gdb python
(gdb) run /path/to/script.py
## wait for segfault ##
(gdb) backtrace
## stack trace of the c code
Run Code Online (Sandbox Code Playgroud)Dav*_*ide 48
我知道你已经解决了你的问题,但对于阅读这个帖子的其他人来说,这就是答案:你必须增加操作系统为python进程分配的堆栈.
这样做的方法是依赖于操作系统.在linux中,您可以使用命令检查ulimit -s当前值,然后可以使用它来增加它ulimit -s <new_value>
尝试将之前的值加倍并继续加倍,如果它不起作用,直到找到一个执行或耗尽内存的值.
通过修复 Python(Python 段错误..谁知道!)和 C++ 实现上的段错误,更新 ulimit 适用于我的 Kosaraju 的 SCC 实现。
对于我的 Mac,我通过以下方式找到了可能的最大值:
$ ulimit -s -H
65532
Run Code Online (Sandbox Code Playgroud)
谷歌搜索找到了我这篇文章,并没有看到下面讨论的“个人解决方案”。
我最近对 Linux 的 Windows 子系统上的 Python 3.7 感到恼火的是:在两台具有相同 Pandas 库的机器上,一台向我发出警告segmentation fault,另一台报告警告。不清楚哪一个更新,但“重新安装”pandas解决了问题。
我在有缺陷的机器上运行的命令。
conda install pandas
Run Code Online (Sandbox Code Playgroud)
更多详细信息:我运行相同的脚本(通过 Git 同步),并且都是带有 WSL + Anaconda 的 Windows 10 计算机。下面是截图来说明这一点。此外,在命令行python会抱怨的机器上Segmentation fault (core dumped),Jupyter 实验室每次都会简单地重新启动内核。更糟糕的是,根本没有发出任何警告。
几个月后更新:我不再在 Windows 计算机上托管 Jupyter 服务器。我现在在 Windows 上使用 WSL 来获取 Linux 服务器上打开的远程端口,并在远程 Linux 计算机上运行我的所有作业。好几个月来我从未遇到过任何执行错误:)