Python не хватает памяти при запуске многопроцессорного приложения внутри цикла for.Выделенная память увеличивается с каждым дополнительным циклом.Как мне решить эту проблему?
Я выполняю большие симуляции Монте-Карло с тысячами симуляций каждая.Чтобы повысить производительность, я использую модуль multiprocessing
и параллельно запускаю отдельные симуляции на 10 ядрах.Каждый симулятор Монте-Карло использует одну и ту же модель, но разные входные данные модели.Я в основном зацикливаюсь на списке ввода и начинаю новую симуляцию Монте-Карло со входами следующих моделей после завершения предыдущей симуляции Монте-Карло.
Странно то, что выделенная память из предыдущей симуляции Монте-Карлоне выпущен после того, как это закончено.Выделенная память просто увеличивается с каждым дополнительным моделированием Монте-Карло, пока у питона не заканчивается память.Каждый объект python из предыдущего моделирования Монте-Карло перезаписывается объектом из следующего моделирования Монте-Карло.Удаление объектов в конце цикла с помощью del
или вызов gc.collect()
не помогает.
Мое текущее решение: реализация цикла for в скрипте 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
.