我有一个使用大量内存的Python应用程序,这应该是可以处理的,因为我在循环中使用
问题是为什么......以及我如何在Python中捕获错误。如果我能捕获它,那就很容易进行缓解,但如果没有异常,我就无法调用我的缓解措施。
提供信息,该应用程序正在处理视频,每个帧都是约15MB的numpy对象。如果我耗尽了内存,我很高兴降低帧速率并重试。
我还尝试了当我加载每个帧时跟踪内存使用情况,使用psutil.available,但该进程被杀死时仍显示约350MB可用内存(总共2GB)。我认为这是一个碎片问题。
因此,我遇到的问题是我可以任意设置一些限制,例如,如果我剩余的空闲内存小于500MB,则减慢帧速率并重新开始,但这似乎有点随意而且不太健壮。如果应用程序或可能是操作系统或硬件发生变化,则下次可能在剩余501MB时崩溃......这就是为什么我宁愿通过MemoryError异常来处理它的原因。
不幸的是,这似乎不是一个常见的问题,“python invoked oom-killer exception”只给我提供了两页谷歌搜索结果!在这里以前大多数答案都是“不要使用太多内存”,这并没有什么帮助——在我的情况下,我想尽可能使用可用的内存,但如果需要,我很乐意使用更少。只是Python在被杀死之前不给我这个机会!
非常感谢任何想法。
try/except MemoryError
。但不幸的是,在此之前,Python会被Debian Linux上的OOM Killer杀死,而不会引发MemoryError异常。问题是为什么......以及我如何在Python中捕获错误。如果我能捕获它,那就很容易进行缓解,但如果没有异常,我就无法调用我的缓解措施。
提供信息,该应用程序正在处理视频,每个帧都是约15MB的numpy对象。如果我耗尽了内存,我很高兴降低帧速率并重试。
我还尝试了当我加载每个帧时跟踪内存使用情况,使用psutil.available,但该进程被杀死时仍显示约350MB可用内存(总共2GB)。我认为这是一个碎片问题。
因此,我遇到的问题是我可以任意设置一些限制,例如,如果我剩余的空闲内存小于500MB,则减慢帧速率并重新开始,但这似乎有点随意而且不太健壮。如果应用程序或可能是操作系统或硬件发生变化,则下次可能在剩余501MB时崩溃......这就是为什么我宁愿通过MemoryError异常来处理它的原因。
不幸的是,这似乎不是一个常见的问题,“python invoked oom-killer exception”只给我提供了两页谷歌搜索结果!在这里以前大多数答案都是“不要使用太多内存”,这并没有什么帮助——在我的情况下,我想尽可能使用可用的内存,但如果需要,我很乐意使用更少。只是Python在被杀死之前不给我这个机会!
非常感谢任何想法。