首页 > 解决方案 > 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 在它被杀死之前没有给我这样做的机会!

任何想法都非常感谢。

标签: pythonlinuxmemoryout-of-memory

解决方案


推荐阅读