¿Es esta una pérdida de memoria?

Estoy usando el módulo gc para depurar una fuga.

Es un progtwig gui y he conectado esta función a un botón.

He establecido la depuración más establecida en gc.SAVE_ALL

 > gc.collect() > > print gc.garbage 

y esta es la salida

[(,), {'__module__': 'ctypes._endian', '__dict__': , '__weakref__': , '_length_': 3, '_type_': , '__doc__': None}, , , , (, , , ), (,), {'__module__': 'ctypes', '__dict__': , '__weakref__': , '_flags_': 1, '__doc__': None, '_restype_': }, , , , (, , , ), {}, , , , , , , , {'Accept': 'application/json', 'User-Agent': 'couchdb-python 0.6'}, (, , , , , , ), , (1,), {}, , , , , , , , {'Accept': 'application/json', 'User-Agent': 'couchdb-python 0.6'}, (, , , , , , ), , (1,), {}, , , , , , , , {'Accept': 'application/json', 'User-Agent': 'couchdb-python 0.6'}, (]

La lista gc.garbage tiene muchos artículos. ¿Significa esto que los objetos en gc.garbage están goteando o han sido recolectados o serán recolectados?

De los documentos :

gc.garbage

Una lista de objetos que el colector encontró inalcanzable pero no pudo ser liberado (objetos incobrables).

Así que me parece una especie de fuga. Ahora los documentos explican las condiciones bajo las cuales esto podría ocurrir:

Los objetos que tienen métodos del () y forman parte de un ciclo de referencia hacen que todo el ciclo de referencia sea incobrable, incluidos los objetos que no están necesariamente en el ciclo pero que solo se pueden alcanzar desde él. Python no recostack dichos ciclos automáticamente porque, en general, no es posible que Python adivine un orden seguro para ejecutar los métodos del (). Si conoce un orden seguro, puede forzar el problema examinando la lista de elementos no utilizados y rompiendo ciclos explícitamente debido a sus objetos dentro de la lista. Tenga en cuenta que estos objetos se mantienen vivos incluso en virtud de estar en la lista de basura, por lo que también deben eliminarse de la basura. Por ejemplo, después de romper ciclos, haga del gc.garbage [:] para vaciar la lista. En general, es mejor evitar el problema al no crear ciclos que contengan objetos con los métodos del (), y en ese caso se puede examinar la basura para verificar que no se están creando dichos ciclos.

Ahora que tiene el DEBUG_SAVEALL indicadores DEBUG_SAVEALL hace que todos sus escapes de basura. De la misma fuente:

gc.DEBUG_SAVEALL

Cuando se establece, todos los objetos inalcanzables encontrados se agregarán a la basura en lugar de liberarlos. Esto puede ser útil para depurar un progtwig de fugas.

Así que, una vez más, sí, esa lista es la memoria filtrada. ¡Pero le dijiste que filtrara todo eso!

En otros idiomas, he usado un generador de perfiles con gran éxito para rastrear las pérdidas de memoria. Nunca he usado uno en Python, pero parece que vale la pena probar Heapy .

En su sección “Procesamiento de datos”, pruebe esta función:

  • Cálculo del conjunto ‘dominado’ a partir de un conjunto de objetos raíz que produce el conjunto de objetos que se desasignarían si los objetos raíz se desasignaran.

Si es como otras herramientas, debería poder profundizar. Sigue los objetos con el ‘conjunto dominado’ más grande hasta que encuentres algo que parezca demasiado grande, probablemente sea una fuga.