我有一个使用大量内存的python应用程序,当我使用try / except MemoryError
在循环中处理它时,这应该没问题。不幸的是,从来没有引发MemoryError异常-在此之前,Python被OOM Killer杀死(在Debian Linux上)。
问题是为什么...以及如何在Python中捕获错误。如果可以抓住,我可以轻松缓解,但没有例外,我无法调用缓解措施。
有关信息,该应用程序正在处理视频,每个帧约为15MB的numpy对象。如果内存不足,我很乐意降低帧频并重试。
我还尝试使用psutil.available在加载每个帧时跟踪内存使用情况,但是该过程被杀死,仍然有约350MB显示为可用内存(总计2GB)。我认为这是一个碎片问题。
因此,我遇到的问题是我可以任意设置一些限制,例如如果我的可用内存小于500MB,则以较低的帧速率重新开始,但是这一切感觉有些武断,而且不够鲁棒。如果应用程序或操作系统或硬件发生了变化,我可能会发现下一次它以501MB的剩余容量崩溃时,还是出现了某些情况……这就是为什么我宁愿通过MemoryError异常来处理它。
可悲的是,这似乎并不是一个普遍的问题,“ python调用的oom-killer异常”仅给我两页Google搜索结果!通常,以前这里的答案是“不要使用太多内存”,这并不是很有帮助-就我而言,我想使用尽可能多的内存,但很乐意在需要时减少使用。只是Python并没有给我机会在它被杀死之前这样做!
任何想法都值得赞赏。