Multiprocessamento e memória do Python
estou usandomultiprocessing.imap_unordered
para executar um cálculo em uma lista de valores:
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()
Cada chamada parafnc
retorna um objeto ENORME como resultado, por design. Eu posso armazenar N instâncias de tal objeto na RAM, onde N ~ cpu_count, mas não muito mais (não centenas).
Agora, usar esta função ocupa muita memória. A memória é inteiramente gasta no processo principal, não nos trabalhadores.
Como é queimap_unordered
armazenar os resultados acabados? Quero dizer, os resultados que já foram retornados pelos trabalhadores, mas ainda não foram repassados ao usuário. Eu pensei que era inteligente e só os computava "preguiçosamente" quando necessário, mas aparentemente não.
Parece que não posso consumir os resultados deprocess_parallel
rápido o suficiente, a piscina continua enfileirando esses objetos enormes defnc
em algum lugar, internamente, e depois explode. Há alguma maneira de evitar isto? Limitar sua fila interna de alguma forma?
Estou usando o Python2.7. Felicidades.