2010-04-24 12 views
5

Estoy intentando usar la biblioteca de multiproceso de python para obtener algún rendimiento. Específicamente estoy utilizando su función map. Ahora, por alguna razón, cuando lo canjeo con su única contraparte procesada, no obtengo un gran uso de memoria. Pero usar la versión de multiprocesamiento del mapa hace que mi memoria se vaya por las nubes. Para que conste, estoy haciendo algo que puede almacenar mucha memoria, pero ¿cuál sería la diferencia entre los dos para causar una diferencia tan marcada?Alto uso de memoria solo cuando multiprocesamiento

+0

Para el registro, esto no suena a una * fuga de memoria * en absoluto, al igual que la memoria * use *. –

+0

Muy cierto, una vez más, malas palabras de mi parte. – Sandro

Respuesta

4

¿Se da cuenta de que el multiprocesamiento no usa hilos, sí? Digo esto porque mencionas una "contraparte de un solo hilo".

¿Está enviando una gran cantidad de datos a través de multiprocessing 's map? Una causa probable es que el multiprocesamiento de serialización tiene que ver en muchos casos. multiprocessing usa pickle, que normalmente ocupa más memoria que los datos que está decapando. (En algunos casos, especialmente en sistemas con fork() donde los nuevos procesos se crean cuando se llama al método map, se puede evitar la serialización, pero cada vez que necesita para enviar nuevos datos de proceso existente que no puede hacerlo.)

Desde con multiprocessing todo el trabajo real se realiza en procesos separados, la memoria de su proceso principal no debe verse afectada por las operaciones reales que realice. Sin embargo, el uso total de la memoria aumenta bastante, ya que cada proceso de trabajo tiene una copia de los datos enviados. A veces, esto es memoria de copiado sobre escritura (en los mismos casos que no se serializa) en sistemas que tienen CoW, pero el uso de memoria de Python es tal que esto se escribe rápidamente y, por lo tanto, se copia.

+0

Correcto, lo siento, pero sí sé que el multiproceso no usa hilos. (De ahí el nombre) Así que enviar la información a través de la tubería es lo que la está matando. Tiene mucho sentido. ¿Conoces alguna solución al problema que estoy enfrentando? – Sandro

+1

Envía más datos. O envíelo en trozos más pequeños. O bien, si está en un sistema con fork(), hágalo para que no ocurra la serialización: asegúrese de que el multiprocesamiento comience nuevos procesos. –

Cuestiones relacionadas