Многопроцессорность и память Python

Я использую multiprocessing.imap_unorderedдля выполнения вычислений со списком значений:

def process_parallel(fnc, some_list):
    pool = multiprocessing.Pool()
    for result in pool.imap_unordered(fnc, some_list):
        for x in result:
            yield x
    pool.terminate()

Каждый вызов fncвозвращает ОГРОМНЫЙ объект в результате, по замыслу. Я могу хранить N экземпляров такого объекта в ОЗУ, где N ~ cpu_count, но не намного больше (не сотни).

Теперь использование этой функции занимает слишком много памяти. память полностью расходуется в основном процессе, а не в воркерах.

Как imap_unorderedхранит готовые результаты? Я имею в виду результаты, которые уже были возвращены воркерами, но еще не переданы пользователю. думал, что это умно, и только вычислял их "лениво" по мере необходимости, но, видимо, это не так.

Похоже, поскольку я не могу потреблять результаты процессов s_parallelдостаточно быстро, пул продолжает ставить в очередь эти огромные объекты из fncгде-то внутри, а затем взрывается. Есть ли способ избежать этого? Как-то ограничить его внутреннюю очередь?


Я использую Python2.7. Ваше здоровье.

20
задан user124114 24 June 2012 в 11:39
поделиться