¿Por qué no libera la memoria Python cuando se borra un objeto de gran tamaño?

"¿Por qué no libera la memoria Python cuando se borra un objeto de gran tamaño?
Si crea un objeto grande y borrar de nuevo, Python probablemente ha liberado la memoria, pero los asignadores de memoria implicados no necesariamente devolver la memoria al sistema operativo, por lo que puede parecer como si el proceso de Python utiliza la memoria mucho más virtual de lo que realmente utiliza."


La asignación de memoria funciona a varios niveles en Python. Hay asignador del propio sistema, que es lo que aparece cuando se registre el uso de memoria utilizando el Windows Task Manager o ps . Luego está el tiempo de ejecución de C asignador de memoria ( malloc ), que obtiene el asignador de memoria del sistema, y se lo pasa en trozos más pequeños a la aplicación. Por último, hay asignador objeto propio de Python, que se utiliza para los objetos de hasta 256 bytes. Esta imputación agarra grandes trozos de la memoria desde el asignador C y chuletas para arriba en pedazos más pequeños usando un algoritmo perfeccionado al máximo para Python.
Exactamente si y cuando asignador de Python devuelve la memoria al tiempo de ejecución C, y cuando el tiempo de ejecución de C devuelve memoria para el sistema operativo, depende de muchos parámetros, incluyendo Python y versiones de la biblioteca, los patrones de la aplicación objeto de asignación, y así sucesivamente. Por ejemplo, CPython 2,5 y más tarde regresa la memoria utilizada por los objetos más pequeños en el asignador de C, cuando sea posible, mientras que las versiones anteriores no lo hizo. Sin embargo, es importante recordar que la memoria que se devuelve a un asignador dado será reutilizado por asignador que, incluso si no se devuelve al sistema.

Otra posible causa para el uso excesivo de la memoria es que Python utiliza las llamadas "listas libres" para ciertos tipos de objetos, incluyendo números enteros y flotantes. Tim Peters escribe:
Si lo hago
 >>> L = rango (50 * 1024 * 100)
 >>> Del L
Python sigue utilizando más de 60 MB. ¿Por qué no se libera la memoria?
Es que ha creado 5 millones enteros simultáneamente con vida, y cada objeto int consume 12 bytes. "Para la velocidad", Python mantiene una lista interna libre de objetos enteros. Desafortunadamente, esa lista libre es a la vez inmortal y sin límites de tamaño. flotadores también utilizar una lista gratuita inmortal y sin límites.
/ ... / ¿Usted realmente necesita una lista con 5 millones enteros? Nunca hago algo parecido ;-)
 for i in xrange (50 * 1024 * 100): # observar la "x" en "xrange"
     lo que
consume una cantidad trivial de la memoria, ya que sólo dos enteros en el rango son a la vez con vida en cualquier momento, y la lista libre hace que la reutilización de su ayuno espacio.





Comentarios

Populares

Buscar en este blog