Multiprocesamiento y memoria de Python.
estoy usandomultiprocessing.imap_unordered
para realizar un cálculo en una 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 llamada afnc
devuelve un objeto ENORME como resultado, por diseño. Puedo almacenar N instancias de tal objeto en la RAM, donde N ~ cpu_count, pero no mucho más (no cientos).
Ahora, usar esta función requiere demasiada memoria. La memoria se gasta por completo en el proceso principal, no en los trabajadores.
Cómoimap_unordered
almacenar los resultados terminados? Me refiero a los resultados que ya fueron devueltos por los trabajadores pero que aún no se han transmitido al usuario. Pensé que era inteligente y solo los computé "perezosamente" según fuera necesario, pero aparentemente no.
Parece que ya no puedo consumir los resultados deprocess_parallel
Lo suficientemente rápido, la piscina mantiene en cola estos enormes objetos desdefnc
En algún lugar, internamente, y luego explota. Hay alguna manera de evitar esto? ¿Limitar su cola interna de alguna manera?
Estoy usando Python2.7. Aclamaciones.