algoritmos de gestión de memoria Python y recolección de basura para resolver

Este artículo presenta la solución de gestión de la memoria y la recolección de basura algoritmos Python, introdujo el mecanismo tradicional de recolección de basura, sus métodos de trabajo, problemas Finalizer y otro contenido relacionado, tiene un cierto valor de referencia, amigos necesitan puedan entender la siguiente.
resumen

Existe en la lista, tuplas, casos, clases, diccionario y funciones problema de referencia circular. There Del ejemplos del método serán procesados de una manera sonido. Para añadir nuevos tipos de apoyo GC es muy fácil. GC y apoyar el pitón regular de Python es compatible a nivel binario.

Generacional trabajos de ejecución de recuperación (en la actualidad tres generaciones). Los resultados medidos por el pybench es de aproximadamente cuatro por ciento por encima. Prácticamente todos los módulos de ampliación debe seguir siendo el mismo funciona correctamente (tuve que modificar la versión estándar del módulo nuevo y cPickle). Gc de un nuevo módulo llamado el depurador se puede utilizar para recuperar de inmediato y establecer las opciones de depuración.

Colector debe ser portable a través de plataformas. versión Python del parche ha pasado todas las pruebas y volver a ejecutar Grial, en reposo y el croquis de tiempo sin ningún problema.

Desde Python 2.0 y versiones posteriores, la recolección de basura portátil ha sido incluido en la que el. La recolección de basura está activado por defecto. Por favor, un poco de alegraba de ello!

¿Por qué necesitamos la recolección de basura?

La versión actual de Python usa el recuento de referencias para gestionar la asignación de memoria. Cada objeto tiene un contador de referencia de Python, este recuento de referencia indica cuántos objetos de punto a ella. Cuando el recuento de referencia es 0, el objeto se libera. contador de referencia para la mayoría de los programas funciona bien. Sin embargo, el recuento de referencia en una naturaleza defectuosa, es causada debido a la referencia circular. El ejemplo más simple de una referencia circular es una referencia al objeto mismo. Por ejemplo:

>>> l = []
>>> l.append(l)
>>> del l

Esto creó una lista de cuenta de referencia es ahora 1. Sin embargo, puesto que ya no es accesible desde el interior de Python, y no puede ser utilizado de nuevo, y debe ser tratado como basura. En la versión actual de Python, no se dará a conocer esta lista.

Referencia circular no es una buena práctica de programación en general, y que casi siempre se puede evitar. Sin embargo, a veces es difícil evitar la creación de una referencia circular, o el programador ni siquiera es consciente del problema de las referencias circulares. Para el programa de larga duración, como un servidor, este problema es particularmente preocupante. Las personas no quieren que sus servidores no pueden ser liberados a causa de una circular en objetos de referencia no pueden acceder a la memoria que se está agotada. Para grandes programas, lo difícil de encontrar se crea una referencia circular.

recolección de basura "tradicional" es lo que?

la recolección de basura tradicionales (como marca - método de barrido o paradas - Método de copia) es generalmente como sigue:

Encontrar el sistema objeto de raíz. El objeto raíz es como un entorno global (como Python en el principal módulo) y el objeto en la pila.
Buscar todos los objetos que se puede acceder a partir de estos objetos. Estos objetos son "activo".
La liberación de todos los demás objetos.
Desafortunadamente, este método no puede ser utilizado para la versión actual de Python. Dado que los módulos de trabajo de expansión, Python no determina totalmente el conjunto de la raíz de los objetos. Si el conjunto de la raíz de los objetos no se puede determinar con precisión, aún tenemos el riesgo de la liberación del objeto referenciado. Diseñado de modo que el uso de otro módulo de expansión, no hay manera de encontrar el objeto portátil en la pila de la corriente C. Por otra parte, la cuenta de referencia proporcionó algunos programadores de Python ya tenemos ganas de la localidad de referencias de memoria sobre los beneficios y la semántica de terminación. Lo mejor que podemos encontrar un número de referencia que es capaz de usar, sino que también puede liberar esquema de las referencias circulares.

¿Cómo funciona este método?

Conceptualmente, este método y el tradicional mecanismo de recolección de basura contrario. Este método intentos de encontrar todos los objetos de difícil acceso, en lugar de ir todos los objetos accesibles. Es mucho más seguro, ya que si este método falla, al menos no sin recolección de basura que es peor (sin tener en cuenta a perder el tiempo y el espacio).

Debido a que estamos todavía en un recolector de basura con el recuento de referencias sólo se necesita encontrar referencias circulares. recuento de referencia se ocupará de otros tipos de residuos. En primer lugar, se observó que la referencia circular sólo puede ser la creación de un objeto contenedor. objeto de contenedor es un objeto que puede contener otros objetos referenciados. En Python, listas, diccionarios, instancias, clases y ejemplos son el objeto contenedor ancestral. Entero y cadena no es un recipiente. Con este descubrimiento, nos dimos cuenta de que el objeto no recipiente puede ser reciclado de basura ignorado. Esta es una optimización útil, como enteros y cadenas deben ser relativamente ligero.

Ahora la idea es registrar todos los objetos de contenedor. Hay varias maneras de hacerlo, sin embargo, la mejor manera es utilizar una lista doblemente enlazada, la lista enlazada en la estructura del objeto comprende un campo de puntero. Así que usted puede insertar rápidamente los objetos retirados de la colección, y no requiere la asignación de memoria adicional. Cuando se crea un contenedor, se inserta en esta colección, se borra, se elimina de la colección.

Ahora que podemos obtener todo el objeto contenedor, ¿cómo podemos encontrar referencias circulares? Primero añadimos otro campo al dos punteros objeto contenedor exterior. Hemos llamado a esta gc_refs campo. Podemos encontrar una referencia circular en los siguientes pasos:

Cada objeto contenedor, el valor de recuento de referencia proporcionado gc_refs del objeto.
Cada objeto contenedor, para encontrar otro recipiente objetos que las referencias y los valores de los mismos gc_refs menos uno.
Todo objeto gc_refs recipiente es mayor que uno objeto referenciado por la colección de objetos fuera del envase. No podemos liberar estos objetos, así que poner estos objetos en otra colección.
El objeto se retira el objeto referenciado no puede ser liberado. Los pusimos y darles acceso a los objetos se eliminan de la colección actual.
En la colección actual de los objetos restantes solamente son referenciados por los objetos de la colección (es decir, que no se pueden tener en Python, que es basura). Ahora podemos liberar estos objetos.
problema finalizador

Nuestro gran plan hay un problema, el problema es utilizar un finalizador. Es el método del Ejemplo Finalizer __del__ en Python. Cuando se utiliza un contador de referencia, Finalizer funcione bien. Cuando el contador de referencia de un objeto cae a cero cuando el, Finalizer lanzado justo antes de que el objeto se llama. Para los programadores, esto es sencillo y fácil de entender.

Cuando la recolección de basura, llame al finalizador se ha convertido en un problema molesto, especialmente cuando se enfrentan con el problema de las referencias circulares. Si dos objetos en una referencia circular tiene finalizador, ¿cómo hacer? El cual la primera llamada? Después de llamar a la primera finalizador, los objetos no pueden ser liberados porque el segundo finalizador puede llegar a ella.

Debido a que no hay una buena solución a este problema, el objeto referenciado tiene un ciclo finalizador no puede ser liberado. En cambio, estos objetos se añaden a una lista global de la basura no pueden ser reciclados. Programas siempre deben ser re-escrito para evitar este problema. Como último recurso, el programa puede leer esta lista global y liberar estas referencias en un bucle para la aplicación actual de una manera significativa.

¿A qué precio?

Al igual que algunas personas dicen, no hay almuerzo gratis bajo el sol. Sin embargo, esta forma de recolección de basura es relativamente barato. Uno de los costos más grandes por cada objeto contenedor necesita espacio de memoria adicional de tres palabras. Hay mantenimiento colección recipiente de arriba. La versión actual del recolector de basura, el costo se basa probablemente en pybench esta tasa de disminución del cuatro por ciento.

El registro actual recolector de basura tres generaciones de objetos de información. Mediante el ajuste de los parámetros, el tiempo pasado en la recolección de basura puede pensar lo pequeño que es lo pequeño. Para algunas aplicaciones, apague la recolección de basura y en tiempo de ejecución automática de llamada explícita puede ser significativo. Sin embargo, los parámetros por defecto de recolección de basura se ejecutan pybench, el tiempo de recolección de basura pasado no se ve muy bien. Es evidente que un gran número de aplicaciones de dispensación objetos contenedor puede causar más tiempo de recolección de basura.

El parche actual añade una nueva configuración de teclas para activar el recolector de basura. Hay recolector de basura con el estándar de Python Python es compatible a nivel binario. Si esta opción está desactivada, el trabajo del intérprete de Python sería ningún impacto.

¿Cómo lo puedo usar?

Sólo tiene que descargar la versión actual de Python en él. El recolector de basura se ha incluido en una futura versión 2.0, y el valor predeterminado es activado por defecto. Si está utilizando la versión 1.5.2 de Python, hay un tal vez una versión antigua de trabajo del remiendo. Si está utilizando una plataforma Windows, puede descargar un python15.dll a ser reemplazado.

recolección de basura Boehm-Demers Conservador

Este parche añade algunas modificaciones para Python 1.5.2, usando un cubo de basura conservador colector Boehm-Demers. Pero usted tiene que golpear el parche. Sigue utilizando el recuento de referencias. El recolector de basura sólo libera la memoria de recuento de referencia no se libera (es decir, las referencias circulares). Este debe ser el mejor rendimiento. Es necesario:

$ cd Python-1.5.2
$ patch -p1 < ../gc-malloc-cleanup.diff
$ patch -p1 < ../gc-boehm.diff
$ autoconf
$ ./configure --with-gc

Supongamos que se instala este parche libgc.a, haciendo opciones de enlace -lgc están disponibles (/ usr / local / lib local debe ser). Si usted no tiene esta biblioteca antes de compilar descargar e instalar.

Actualmente, este parche sólo se ha probado en Linux. Tal vez también trabajar en otras máquinas Unix. En mi máquina Linux, la versión de GC de Python pasa todas las pruebas de regresión.

Me dirijo a usted, para todo el mundo para recomendar una muy amplia recolección de recursos de aprendizaje pitón, haga clic para entrar , hay un programador senior antes de aprender a compartir experiencias, notas de estudio, hay una posibilidad de experiencia en los negocios, y para todo el mundo para organizar cuidadosamente un cero pitón la base de los datos reales del proyecto, Python diariamente para que en la última tecnología, las perspectivas, los pequeños detalles de aprendizaje tiene que dejar un mensaje
resumen

Eso es todo por este artículo acerca de los algoritmos de gestión de la memoria y la recolección de basura Python resuelto

Publicado 43 artículos originales · elogios ganado 13 · Vistas a 50000 +

Supongo que te gusta

Origin blog.csdn.net/haoxun11/article/details/105057229
Recomendado
Clasificación