Я использую 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
возвращает объект HUGE в результате, по дизайну. Я могу хранить N экземпляров такого объекта в ОЗУ, где N ~ cpu_count, но не намного больше (не сотни).
Теперь использование этой функции занимает слишком много памяти. Память полностью расходуется в основном процессе, а не на рабочих.
Как imap_unordered
сохранить готовые результаты? Я имею в виду результаты, которые уже были возвращены работниками, но еще не переданы пользователю. Я думал, что он умный и только вычислил их "лениво" по мере необходимости, но, видимо, нет.
Похоже, что, поскольку я не могу достаточно быстро использовать результаты process_parallel
, пул продолжает массово размещать эти огромные объекты из fnc
где-то, внутри, а затем взрывается. Есть ли способ избежать этого? Ограничить внутреннюю очередь?
Я использую Python2.7. Приветствия.