2010-06-22 6 views
7

Mi memoria de proceso de código python aumenta dinámicamente ya que almacena datos dinámicos en listas, diccionarios y tuplas cuando sea necesario. Aunque todos esos datos dinámicos se borran físicamente en sus variables después de eso, la memoria no se está disparando.crecimiento de la memoria de proceso de python en el tiempo

Por lo tanto, sentí que hay una pérdida de memoria y utilicé el método gc.collect() para recopilar toda la memoria sin actualizar. Pero no pude hacer la memoria al mínimo cuando no hay datos en las variables.

+0

¿Por qué esperas que baje? ¿Qué sistema operativo estás usando? En muchos sistemas operativos, una vez que un proceso ha adquirido memoria, el proceso se mantiene así. –

+0

estoy usando mac osx 10.5, creo que más tarde comería más espacio. actualmente había crecido alrededor de 15MB más desde los 24MB en la etapa inicial. Creo que la memoria de proceso debería crecer en términos de MB, lo que podría afectar el tamaño de la memoria disponible. – herby

Respuesta

6

Es muy difícil, en general, por un proceso de "dar la memoria de vuelta al sistema operativo" (hasta que el proceso termina y el sistema operativo vuelva todo la memoria, por supuesto) porque (en la mayoría de implementación) lo malloc los retornos están tallados en bloques grandes para mayor eficiencia, pero no se puede devolver el bloque completo si alguna parte de él todavía está en uso, por lo que la mayoría de las bibliotecas estándar C ni siquiera lo intentan.

Para una discusión decente en un contexto de Python, consulte p. Ej. here. Evan Jones solucionó algunos problemas específicos de Python como se describe en here y here, pero su parche está en el maletero desde Python 2.5, por lo que los problemas que está observando son definitivamente con el paquete malloc del sistema, no con Python per se. Una explicación específica de 2.6 es here y here.

Un SO hilo es here, donde Hugh Allen en su respuesta cita a los programadores de Firefox para extender que Mac OS X es un sistema en el que es básicamente imposible para un proceso de dar de nuevo a la memoria del sistema operativo.

Por lo tanto, solo al finalizar un proceso puede asegurarse de liberar su memoria. Por ejemplo, un servidor de larga ejecución, de vez en cuando, puede tomar una instantánea de su estado en el disco y apagarse (con un pequeño proceso de vigilancia, sistema o personalizado, vigilándolo y reiniciándolo). Si sabe que la siguiente operación requerirá mucha memoria durante un tiempo breve, a menudo puede os.fork, realizar el trabajo de memoria en el proceso secundario y obtener resultados (si los hay) devueltos al proceso principal a través de un conducto como el proceso hijo termina. Y así sucesivamente y así sucesivamente.

0

¿Qué tan grande estamos hablando? Python en sí mismo ocupa algo de memoria ... hasta quizás 30 o 40 MB, creo. Si es más grande que eso y no se recopila, tiene una pérdida de memoria. Solo se puede recolectar basura sin referencias, de alguna manera todavía se hace referencia a sus elementos adicionales. Haz un perfil de memoria y mira lo que está pasando.

+0

actualmente había crecido alrededor de 15 MB más desde 24 MB en la etapa inicial para el escenario mínimo. Sin embargo, probé la herramienta de enlace a continuación, de la cual encontré que los datos referidos no son más de 3MB. No pude obtener la cantidad de memoria restante. – herby

+0

Eso no es tan grande. Si está buscando un programa de memoria súper bajo, normalmente no codifica en Python. La mayoría de las PC tienen 2-4GB de ram, 15 MB no vale la pena preocuparse. – bwawok

Cuestiones relacionadas