python - 运行函数后强制释放内存

标签 python python-3.x

我使用的模块(我无法修改)包含我需要使用的方法。此方法返回 10GB 的数据,但也分配了 8GB 的​​内存,它不会释放。我需要在长时间运行的脚本开始时使用此方法,并且我想确保在运行该方法后释放 8GB 内存。我在这里有哪些选择?

需要明确的是,8GB 不会被脚本重用 - 即,如果我在运行该方法后创建一个大的 numpy 数组,则会为该 numpy 数组分配额外的内存。

我考虑过使用多处理模块在单独的进程中运行该方法(并返回结果),但是在序列化该方法的大结果时遇到问题 - 默认 pickler 无法 pickle 10GB,即使我强制multiprocessing to use pickle version 4 pickling 有非常大的内存开销。如果不能修改有问题的模块,我还能做些什么吗?

编辑:这是一个例子

from dataloader import dataloader1
result = dataloader1.get("DATA1")

据我了解,dataloader 是使用 pybind11 围绕一些 C++ 代码的 Python 包装器。我对它的内部运作了解不多。上面的代码导致使用了 18GB。如果我然后运行

del result

10GB 被正确释放,但 8GB 继续被使用(似乎不再存在 python 对象)。

Edit2:如果我创建一个较小的 numpy 数组(例如 3GB),内存使用量保持在 8GB。如果我删除它并创建一个 6GB 的 numpy 数组,内存使用量将变为 14GB,并在我删除它后恢复到 8GB。我仍然需要释放给操作系统的 8GB。

最佳答案

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

关于python - 运行函数后强制释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58026888/

相关文章:

python - LabelEncoder 未将字符串转换为数字 (0,1,2)

python - 如何确定列表是否包含彼此相邻的 3 个偶数或 3 个奇数?

python - "How to show the value of differences between two line' 线图中的数据点?”

python - 适用于 Python 中任何平台的 Unix 路径?

python - 如何从 python 中的排名组中随机选择数字,以创建特定长度的列表

python - WindowsError 关闭后移动 sqlite3 数据库

python - 对分搜索最低付款 (Python) - 答案太大

python-3.x - Python 调试器没有进入协程?

python - 在 Python Django 中渲染基本 html 模板内的子页面

python - 有没有办法用 python 检查列表中的字符串是否是普通英语中使用的真实单词?