Высокое использование памяти с помощью многопроцессорной обработки Python
Я видел пару сообщений об использовании памяти с помощью модуля многопроцессорной обработки Python. Однако вопросы неКажется, я не решаю проблему, которая у меня здесь есть. Я публикую свой анализ с надеждой, что кто-нибудь сможет мне помочь.
вопросЯ использую многопроцессорную обработку для параллельного выполнения задач и заметил, что потребление памяти рабочими процессами растет бесконечно. У меня есть небольшой отдельный пример, который должен повторить то, что я заметил.
import multiprocessing as mp
import time
def calculate(num):
l = [num*num for num in range(num)]
s = sum(l)
del l # delete lists as an option
return s
if __name__ == "__main__":
pool = mp.Pool(processes=2)
time.sleep(5)
print "launching calculation"
num_tasks = 1000
tasks = [pool.apply_async(calculate,(i,)) for i in range(num_tasks)]
for f in tasks:
print f.get(5)
print "calculation finished"
time.sleep(10)
print "closing pool"
pool.close()
print "closed pool"
print "joining pool"
pool.join()
print "joined pool"
time.sleep(5)
системаЯ использую Windows и использую диспетчер задач для контроля использования памяти. Я использую Python 2.7.6.
наблюдениеЯ суммировал потребление памяти двумя рабочими процессами ниже.
+---------------+----------------------+----------------------+
| num_tasks | memory with del | memory without del |
| | proc_1 | proc_2 | proc_1 | proc_2 |
+---------------+----------------------+----------------------+
| 1000 | 4884 | 4694 | 4892 | 4952 |
| 5000 | 5588 | 5596 | 6140 | 6268 |
| 10000 | 6528 | 6580 | 6640 | 6644 |
+---------------+----------------------+----------------------+
В приведенной выше таблице я пытался изменить количество задач и наблюдать за потреблением памяти в конце всех вычислений и доjoin
-инpool
, 'дель» а также 'без дель варианты ли я откомментировать или комментироватьdel l
линия внутриcalculate(num)
функция соответственно. До расчета потребление памяти составляет около 4400.
У меня есть процесс, который основан на этом примере и предназначен для долгосрочной работы. Я замечаю, что эти рабочие процессы занимают много памяти (~ 4 ГБ) после ночного запуска. Делатьjoin
освободить память не вариант, и я пытаюсь найти выход безjoin
-ную.
Это кажется немного загадочным. Кто-нибудь сталкивался с чем-то подобным? Как я могу исправить эту проблему?