我正在用Python实现Kosaraju的强连接组件(SCC)图搜索算法 .
该程序在小数据集上运行良好,但是当我在超大图(超过800,000个节点)上运行它时,它会显示“Segmentation Fault” .
可能是什么原因造成的?谢谢!
附加信息:首先,我在超大型数据集上运行时出现此错误:
"RuntimeError: maximum recursion depth exceeded in cmp"
然后我使用重置递归限制
sys.setrecursionlimit(50000)
但得到了“分段错误”
相信我,它不是一个无限循环,它在相对较小的数据上运行正确 . 该计划有可能耗尽资源吗?
6 回答
当python扩展(用C编写)试图访问超出范围的内存时会发生这种情况 .
您可以通过以下方式跟踪它 .
在代码的第一行添加sys.settrace .
使用
gdb
,如this answer中Mark所述..在命令提示符处我知道你已经解决了你的问题,但对于阅读这个帖子的其他人来说,这就是答案:你必须增加操作系统为python进程分配的堆栈 .
这样做的方法是依赖于操作系统 . 在linux中,您可以使用命令
ulimit -s
检查当前值,然后使用ulimit -s <new_value>
增加它尝试将前一个值加倍并继续加倍,如果它不起作用,直到找到一个执行或耗尽内存的值 .
分段错误是一个通用错误,有很多可能的原因:
内存不足
Ram内存故障
使用查询从数据库中获取大量数据集(如果获取的数据大小超过交换内存)
错误的查询/错误代码
有长循环(多次递归)
通过修复Python(Python段错误,谁知道!)和C实现的段错误,更新ulimit对我的Kosaraju的SCC实现起作用 .
对于我的MAC,我发现可能的最大通过:
谷歌搜索找到了我这篇文章,我没有看到下面讨论的“个人解决方案” .
我最近在Linux子系统Linux上使用Python 3.7的烦恼是:在具有相同Pandas库的两台机器上,一个给我
segmentation fault
,另一个报告警告 . 目前尚不清楚哪一个更新,但是"re-installing"pandas
解决了这个问题 .我跑在越野车上的命令 .
更多细节:我运行相同的脚本(通过Git同步),两者都是带有WSL Anaconda的Windows 10机器 . 这里是截图来说明案例 . 此外,在命令行
python
将抱怨Segmentation fault (core dumped)
的机器上,Jupyter实验室每次都只是重启内核 . 更糟糕的是,根本没有发出任何警告 .在RPI上升级dlib后,我遇到了这种分段错误 . 我按照上面的Shiplu Mokaddim的建议追踪了堆栈,并确定了一个OpenBLAS库 .
由于OpenBLAS也是多线程的,因此在多线程应用程序中使用它会指数级地增加线程直到分段错误 . 对于多线程应用程序,将OpenBlas设置为单线程模式 .
在python虚拟环境中,通过编辑告诉OpenBLAS只使用单个线程:
并添加:
重新启动后,我能够在rpi3b上运行我以前崩溃的所有图像识别应用程序 .
参考:https://github.com/ageitgey/face_recognition/issues/294