многопроцессорная обработка с большими данными
Я используюmultiprocessing.Pool()
распараллелить некоторые тяжелые вычисления.
Функция target возвращает много данных (огромный список). У меня заканчивается ОЗУ.
Безmultiprocessing
Я бы просто изменил целевую функцию на генератор,yield
получая полученные элементы один за другим по мере их вычисления.
Я понимаю, что многопроцессорная обработка не поддерживает генераторы - она ожидает весь вывод и возвращает его сразу, верно? Нет уступок. Есть ли способ сделатьPool
рабочие выдают данные, как только они становятся доступными, не создавая весь массив результатов в оперативной памяти?
Простой пример:
def target_fnc(arg):
result = []
for i in xrange(1000000):
result.append('dvsdbdfbngd') # <== would like to just use yield!
return result
def process_args(some_args):
pool = Pool(16)
for result in pool.imap_unordered(target_fnc, some_args):
for element in result:
yield element
Это Python 2.7.