Fugas de memoria de Python


Answers

pympler mayoría de las opciones mencionadas anteriormente pero encontré que este paquete pequeño e intuitivo es el mejor:

Es bastante sencillo rastrear objetos que no fueron recolectados como basura, consulte este pequeño ejemplo:

instalar el paquete a través de pip install pympler

from pympler.tracker import SummaryTracker
tracker = SummaryTracker()

# ... some code you want to investigate ...

tracker.print_diff()

El resultado muestra todos los objetos que se han agregado, más la memoria que consumieron.

Muestra de salida:

                                 types |   # objects |   total size
====================================== | =========== | ============
                                  list |        1095 |    160.78 KB
                                   str |        1093 |     66.33 KB
                                   int |         120 |      2.81 KB
                                  dict |           3 |       840 B
      frame (codename: create_summary) |           1 |       560 B
          frame (codename: print_diff) |           1 |       480 B

Este paquete proporciona varias características más. Verifique la documentación de la impresora , en particular la sección Identificación de fugas de memoria .

Question

Tengo un script de larga duración que, si lo dejo funcionar lo suficiente, consumirá toda la memoria de mi sistema.

Sin entrar en detalles sobre el guión, tengo dos preguntas:

  1. ¿Hay alguna "Mejores Prácticas" a seguir, que ayudará a prevenir las fugas?
  2. ¿Qué técnicas existen para depurar fugas de memoria en Python?



El módulo Tracemalloc se integró como un módulo integrado a partir de Python 3.4 y, al parecer, también está disponible para versiones anteriores de Python como una biblioteca de terceros (aunque aún no lo han probado).

Este módulo es capaz de generar los archivos y líneas precisos que asignaron la mayor cantidad de memoria. En mi humilde opinión, esta información es infinitamente más valiosa que el número de instancias asignadas para cada tipo (que termina siendo muchas tuplas el 99% del tiempo, lo cual es una pista, pero apenas ayuda en la mayoría de los casos).

Recomiendo que uses tracemalloc en combinación con pyrasite . 9 de cada 10 veces, ejecutar el fragmento de los 10 primeros en un pyrasite-shell le dará suficiente información y sugerencias para arreglar la fuga en 10 minutos. Sin embargo, si aún no puede encontrar la causa de la fuga, pyrasite-shell en combinación con las otras herramientas mencionadas en este hilo probablemente le dará más pistas. También debe echar un vistazo a todos los ayudantes adicionales proporcionados por pyrasite (como el visor de memoria).




Especialmente debe echar un vistazo a sus datos globales o estáticos (datos de larga duración).

Cuando estos datos crecen sin restricciones, también puede tener problemas en Python.

El recolector de basura solo puede recopilar datos, que ya no se referencian. Pero sus datos estáticos pueden conectar elementos de datos que deberían liberarse.

Otro problema pueden ser los ciclos de memoria, pero al menos, en teoría, el recolector de basura debería encontrar y eliminar ciclos, al menos mientras no estén enganchados a algunos datos vivientes largos.

¿Qué tipos de datos de larga vida son especialmente problemáticos? Eche un vistazo a las listas y diccionarios: pueden crecer sin límite. En los diccionarios, es posible que incluso no vea el problema, ya que cuando acceda a dicts, la cantidad de claves en el diccionario puede no ser de gran visibilidad para usted ...




Para detectar y localizar fugas de memoria para procesos de larga ejecución, por ejemplo, en entornos de producción, ahora puede usar stackimpact . Utiliza tracemalloc debajo. Más información en esta publicación .




Related