Многопроцессорность Python для цикла for;память не очищается между циклами - PullRequest
0 голосов
/ 06 февраля 2019

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.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

del удалит только привязку между переменной (идентификатором) и объектом, поэтому объект все еще будет существовать в памяти.

Попробуйте mc=None вместо del mc

0 голосов
/ 06 февраля 2019

Сборщик мусора выполняет свою работу независимо от кода.Пока del удаляет объект, он не вызывает сборщик мусора.

Вы можете import gc получить довольно обширный API для сборщика мусора, включая явный запуск сборщика мусора (например, после del mc) и инструменты для отладки программ с утечкой.

См.: https://docs.python.org/3/library/gc.html

...