首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python MemoryError不引发-调用OOM-Killer代替?

Python MemoryError不引发-调用OOM-Killer代替?
EN

Stack Overflow用户
提问于 2018-09-09 20:47:29
回答 1查看 1.9K关注 0票数 8

我有一个python应用程序,它使用了大量的内存,在使用try / except MemoryError的循环中处理它应该是很好的。不幸的是,MemoryError异常从未被引发-在此之前,python被OOM杀死(在Debian上)。

问题是为什么..。以及如何在Python中捕获错误。如果我能抓住它,我有一个简单的缓解,但除了例外,我不能调用我的缓解。

对于信息,应用程序正在处理视频,每个帧都是15 is的numpy对象。如果内存不足,我很乐意降低帧率,然后再试一次。

在使用psutil.available加载每个帧时,我也尝试过跟踪内存的使用情况,但是进程被终止时仍有~350 2GB显示为可用内存(总内存为2GB)。我想这是个碎裂的问题。

因此,我的问题是,我可以任意设置一些限制,例如,如果我获得了<500 it的空闲内存,然后再次以较低的帧速率启动,但这一切都感觉有点任意性和不太健壮。如果应用程序或者操作系统或硬件发生了变化,我可能会发现,下次它会以501 at的速度崩溃,或者什么的.这就是为什么我宁愿通过MemoryError异常来处理它。

可悲的是,这似乎不是一个常见的问题,因为"python调用了oom-杀手例外“只给了我两页的谷歌搜索结果!以前这里的答案大多是“不要使用那么多内存”,这不是很有帮助--在我的例子中,我想使用尽可能多的内存,但如果需要的话,我很乐意使用更少的内存。只是Python没有给我在被杀死之前这么做的机会!

任何想法都很感激。

EN

回答 1

Stack Overflow用户

发布于 2022-10-31 21:15:12

numpy倾向于将所有内容放入内存中,因此您可以同时检查内存中有多少视频文件。

“简单”测试有多少文件可以加载到内存中

代码语言:javascript
复制
import numpy as np
import sys
import math
import random


def real_size(obj):
    size_bytes = sys.getsizeof(obj)
    if size_bytes == 0:
        return "0B"
    size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
    i = int(math.floor(math.log(size_bytes, 1024)))
    p = math.pow(1024, i)
    s = round(size_bytes / p, 2)
    return "%s %s" % (s, size_name[i])


def object_15():
    """
    This creates an numpy object with ~15MB
    """
    row = [random.random()] * 2080000
    data = np.array(row).astype(float)
    return data


def my_read_file(number_of_files):
    data = object_15()
    for i in range(number_of_files):
        data = np.append(data, object_15())
    return data

print(f'Just checking that each object has ~15MB: {real_size(object_15())}')
number_of_files = 100
print(f'Objects loaded into memory = {number_of_files}\nTotal memory_used = {real_size(my_read_file(number_of_files))}')

def object_15():“”这将创建一个具有~15 an的numpy对象“”行= random.random() * 2080000 data =np.array(行).astype(浮点)返回数据。

def my_read_file(number_of_files):data = object_15() for I in range(number_of_files):data = np.append( data,object_15())返回数据

print(f‘仅检查每个对象有~15 100:{real_size(object_15())}') number_of_files =100 print(f’‘Objects加载到内存中={number_of_files}\n memory_used = {real_size(my_read_file(number_of_files))}')

根据这个测试,您应该能够拥有大约100个numpy对象,每个对象的大小为15 GB,并且不超过2GB。请修改代码,并根据您的特定需求/对象类型进行尝试。

这里有更多信息:

您可能需要考虑的其他主题包括:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52248531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档