首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >for循环中的Python多处理;循环之间未清除内存

for循环中的Python多处理;循环之间未清除内存
EN

Stack Overflow用户
提问于 2019-02-06 23:28:21
回答 2查看 235关注 0票数 0

在for循环中启动多进程应用程序时,Python内存不足。每增加一个循环,分配的内存就会变得更大。如何解决此问题?

我正在执行大型蒙特卡洛模拟,每个模拟都有数千个模拟。为了获得性能提升,我使用了multiprocessing模块,并在10个内核上并行运行各个模拟。每个蒙特卡洛模拟使用相同的模型,但不同的模型输入。我基本上是在循环一个输入列表,并在上一个蒙特卡罗模拟完成后,用下一个模型的输入开始一个新的蒙特卡罗模拟。

奇怪的是,之前的蒙特卡洛模拟中分配的内存并没有在它完成后释放。每增加一次蒙特卡洛模拟,分配的内存就会越来越大,直到python耗尽内存。上一次蒙特卡洛模拟中的每个python对象都会被下一次蒙特卡洛模拟中的对象覆盖。使用del或调用gc.collect()删除循环末尾的对象无济于事。

我目前的解决方案是:在一个bash脚本中实现for循环,该脚本在每个循环中调用python。

代码非常大,由几个不同的类组成。基本上这就是发生的事情:

代码语言:javascript
运行
复制
from monte_carlo import mc_class

input_list = [input1, input2, ...]
model_parameters = ...

for inpt in input_list:
    mc = mc_class(model_parameters=model_parameters, model_inputs=inpt)
    mc.run()
    mc.save_results()
    mc.generate_plots()
    del mc

mc.run()开始蒙特卡洛模拟。这个调用创建了几个进程,运行它们并收集结果。代码与https://github.com/lbl-srg/EstimationPy/blob/master/estimationpy/fmu_utils/fmu_pool.py基本相同

我期望在multiprocessing完成后释放内存。我认为python会进行垃圾回收,特别是在del mc之后。

EN

回答 2

Stack Overflow用户

发布于 2019-02-06 23:44:42

垃圾收集器独立于代码执行其工作。当del删除一个对象时,它不会调用垃圾回收器。

你可以通过import gc获得一个非常广泛的垃圾收集器应用编程接口,包括显式地运行垃圾收集器(例如,在你的del mc之后)和调试泄漏程序的工具。

请参阅:https://docs.python.org/3/library/gc.html

票数 0
EN

Stack Overflow用户

发布于 2019-02-06 23:47:19

del只会删除变量(标识符)和对象之间的绑定赋值,因此对象仍然存在于内存中。

尝试mc=None而不是del mc

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

https://stackoverflow.com/questions/54557091

复制
相关文章

相似问题

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