Высокое использование памяти с помощью многопроцессорной обработки 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-ную.

Это кажется немного загадочным. Кто-нибудь сталкивался с чем-то подобным? Как я могу исправить эту проблему?

Ответы на вопрос(1)

Ваш ответ на вопрос