python - Python MemoryError 未引发 - 改为调用 OOM-Killer?
问题描述
我有一个使用大量内存的 python 应用程序,这应该没问题,因为我在循环中使用try / except MemoryError
. 不幸的是,MemoryError 异常从未引发——在此之前,python 被 OOM Killer 杀死(在 Debian Linux 上)。
问题是为什么......以及如何在 Python 中捕获错误。如果我能抓住它,我就有一个简单的缓解措施,但无一例外,我无法调用我的缓解措施。
有关信息,该应用程序正在处理视频,每帧约为 15MB numpy 对象。如果内存不足,我很乐意降低帧速率并重试。
我还尝试使用 psutil.available 在加载每一帧时跟踪内存使用情况,但该进程被终止,仍然显示为可用内存约 350MB(总共 2GB)。我认为这是一个碎片问题。
因此,我遇到的问题是我可以任意设置一些限制,例如,如果我获得 <500MB 的可用内存,然后以较低的帧速率重新开始,但这一切都感觉有点随意,而且不是很健壮。如果应用程序或操作系统或硬件发生变化,我可能会发现下次它在剩余 501MB 时崩溃,或者其他什么......这就是为什么我宁愿通过 MemoryError 异常处理它。
遗憾的是,这似乎不是一个常见问题,“python 调用 oom-killer 异常”只给了我两页谷歌搜索结果!以前这里的大多数答案是“不要使用太多内存”,这不是很有帮助 - 在我的情况下,我想尽可能多地使用,但如果需要,我很乐意使用更少。只是 Python 在它被杀死之前没有给我这样做的机会!
任何想法都非常感谢。
解决方案
推荐阅读
- syntax-error - 将断言子句与 where 子句结合起来
- python - Pipenv 与 Conda?
- c# - 如何将 WPF 控件文本绑定到布尔值,并对 xaml 中的文本做出决定
- r - 像 Excel 一样绘图
- vue.js - 如何在应用程序外部安装路由器链接?
- rsync - 使用 Fabric 在 DigitalOcean 上部署夹层站点
- python - 使用 apply 使用数据元组填充 Pandas 数据框行
- javascript - 如何平滑所有 JavaScript 过渡?
- video - ffmeg 在特定间隔强制关键帧
- vb.net - 如何在 VB.net 中制作对象数组?