multiprocessamento com dados grandes
estou usandomultiprocessing.Pool()
para paralelizar alguns cálculos pesados.
A função de destino retorna muitos dados (uma lista enorme). Estou ficando sem RAM.
Semmultiprocessing
, Eu acabei de mudar a função alvo em um gerador, poryield
os elementos resultantes, um após o outro, como são calculados.
Eu entendo que o multiprocessamento não suporta geradores - ele aguarda a saída inteira e a retorna de uma só vez, certo? Não rendendo. Existe uma maneira de fazer oPool
Trabalhadores produzem dados assim que ficam disponíveis, sem construir toda a matriz de resultados na RAM?
Exemplo simples:
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
Este é o Python 2.7.