为了账号安全,请及时绑定邮箱和手机立即绑定

运行函数后强制释放内存

运行函数后强制释放内存

莫回无 2022-06-02 15:43:29
我使用了一个模块(我无法修改),其中包含我需要使用的方法。此方法返回 10GB 的数据,但也分配了 8GB 的内存,它不会释放。我需要在一个长时间运行的脚本开始时使用这个方法,并且我想确保在我运行该方法后释放 8GB 的内存。我在这里有什么选择?需要明确的是,脚本不会重用 8GB - 即,如果我在运行该方法后创建了一个大型 numpy 数组,则会为该 numpy 数组分配额外的内存。我考虑过使用 multiprocessing 模块在单独的进程中运行该方法(并返回结果),但在序列化该方法的大结果时遇到问题 - 默认pickler无法腌制 10GB,即使我强制使用 multiprocessing pickle 版本 4 酸洗具有非常大的内存开销。如果不能修改有问题的模块,我还能做些什么吗?编辑:这是一个例子from dataloader import dataloader1result = dataloader1.get("DATA1")据我了解,dataloader 是使用 pybind11 围绕一些 C++ 代码的 Python 包装器。我对它的内部运作了解不多。上面的代码导致使用 18GB。如果我再跑del result10GB 被正确释放,但 8GB 继续使用(似乎不再存在 python 对象)。Edit2:如果我创建一个较小的 numpy 数组(例如 3GB),内存使用量将保持在 8GB。如果我删除它并创建一个 6GB 的 numpy 数组,则内存使用量将达到 14GB,并在我删除它后又回到 8GB。我仍然需要发布到操作系统的 8GB。
查看完整描述

3 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

可以修改功能吗?如果内存被某个模块占用,请尝试重新加载该模块(importlib.reload),这应该会释放内存。



查看完整回答
反对 回复 2022-06-02
?
临摹微笑

TA贡献1982条经验 获得超2个赞

Python 使用 2 种不同的机制来释放内存。

  1. 引用计数主要使用并在不再需要时立即释放内存(例如,对象从范围中丢失)。

  2. 垃圾收集器,它是次要的,用于收集具有循环引用的对象(a -> b -> c -> a)。这可以使用方法触发。否则 Python 自己会决定何时释放内存。

但是,我强烈建议对代码进行分析和更改,以使其不使用太多内存。也许查看流,或使用数据库。


查看完整回答
反对 回复 2022-06-02
?
MMTTMM

TA贡献1869条经验 获得超4个赞

如果内存没有被 gc 释放,可能是因为对象存储在创建它的类中,所以一个选项是在类(通过分析)实例中查找这个大属性是什么并将其分配给None可能导致 gc 释放内存。



查看完整回答
反对 回复 2022-06-02
  • 3 回答
  • 0 关注
  • 262 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信