Python的启动里面一个多应用循环时耗尽内存。分配的内存越吹每增加一个循环。如何解决这个问题?
我与成千上万的每一个模拟的执行大型Monte Carlo模拟。要获得性能提升,我现在用的是multiprocessing
模块和10个核心运行模拟并行的个人。每蒙特卡罗模拟使用相同的模型,但是不同的模型输入。我基本上遍历的输入列表,并完成了前面的蒙特卡罗模拟之后的下一个模型输入开始一个新的蒙特卡罗模拟。
奇怪的是,它结束后,从以前的蒙特卡罗模拟分配的内存不会被释放。直到蟒蛇内存用完所分配的内存只是更大的增长每增加蒙特卡罗模拟。从以前的蒙特卡罗模拟每个Python对象是通过从下一个蒙特卡罗模拟的对象覆盖。删除的对象在循环的末尾使用del
或调用gc.collect()
是没有帮助。
我目前的解决方案:的实现在bash脚本,可以与每个循环中调用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
后。
垃圾收集器独立做从代码的工作。虽然del
删除对象,它不会调用垃圾收集器。
您可以import gc
得到相当广泛的API垃圾收集器,包括明确地运行垃圾收集器(例如,您的del mc
后)和调试程序泄漏的工具。
del
只会移除变量(标识符)和对象之间的结合分配,所以对象将仍然存在于内存中。
尝试mc=None
代替del mc
的