Я использую 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. Ваше здоровье.