在for循环中启动多进程应用程序时,Python内存不足。每增加一个循环,分配的内存就会变得更大。如何解决此问题?
我正在执行大型蒙特卡洛模拟,每个模拟都有数千个模拟。为了获得性能提升,我使用了multiprocessing
模块,并在10个内核上并行运行各个模拟。每个蒙特卡洛模拟使用相同的模型,但不同的模型输入。我基本上是在循环一个输入列表,并在上一个蒙特卡罗模拟完成后,用下一个模型的输入开始一个新的蒙特卡罗模拟。
奇怪的是,之前的蒙特卡洛模拟中分配的内存并没有在它完成后释放。每增加一次蒙特卡洛模拟,分配的内存就会越来越大,直到python耗尽内存。上一次蒙特卡洛模拟中的每个python对象都会被下一次蒙特卡洛模拟中的对象覆盖。使用del
或调用gc.collect()
删除循环末尾的对象无济于事。
我目前的解决方案是:在一个bash脚本中实现for循环,该脚本在每个循环中调用python。
代码非常大,由几个不同的类组成。基本上这就是发生的事情:
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
之后。
发布于 2019-02-06 23:44:42
垃圾收集器独立于代码执行其工作。当del
删除一个对象时,它不会调用垃圾回收器。
你可以通过import gc
获得一个非常广泛的垃圾收集器应用编程接口,包括显式地运行垃圾收集器(例如,在你的del mc
之后)和调试泄漏程序的工具。
发布于 2019-02-06 23:47:19
del
只会删除变量(标识符)和对象之间的绑定赋值,因此对象仍然存在于内存中。
尝试mc=None
而不是del mc
https://stackoverflow.com/questions/54557091
复制相似问题