estoy usando multiprocessing.imap_unordered
para realizar un cálculo en una lista de valores:multiprocesamiento de Python y la memoria
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 a fnc
devuelve un objeto enorme, como resultado, por diseño. Puedo almacenar N instancias de dicho objeto en la RAM, donde N ~ cpu_count, pero no mucho más (no cientos).
Ahora, el uso de esta función ocupa demasiada memoria. La memoria se gasta por completo en el proceso principal, no en los trabajadores.
¿Cómo almacena imap_unordered
los resultados finales? 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 calculé "perezosamente" según las necesidades, pero aparentemente no.
Parece que como no puedo consumir los resultados de process_parallel
lo suficientemente rápido, la agrupación sigue haciendo cola estos objetos enormes desde fnc
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.
Bueno, de lo que veo 'rendimiento' es en el proceso principal, no dentro de' fnc' (es decir, la función hecha por los trabajadores). ¿'fnc' está haciendo una evaluación perezosa? – Felix
@FelixBonkoski No, 'fnc' toma un solo elemento de' some_list', y calcula y devuelve un gran objeto de él. – user124114
Solo límite de velocidad en función de la memoria disponible. –