Articles of recolección de basura

Evitar que TextIOWrapper se cierre en GC de una manera compatible con Py2 / Py3

Lo que necesito para lograr: Dado un archivo binario, descodifíquelo de dos maneras diferentes proporcionando una API TextIOBase . Idealmente, estos archivos subsiguientes se pueden pasar sin que yo necesite realizar un seguimiento de su vida útil explícitamente. Desafortunadamente, envolver un BufferedReader resultará en que ese lector se cierre cuando el TextIOWrapper fuera del scope. […]

¿Todos los objetos de Python son rastreados por el recolector de basura?

Estoy intentando depurar una pérdida de memoria (ver pregunta sobre la pérdida de memoria en Python Twisted: ¿dónde está? ). Cuando el recolector de basura se está ejecutando, ¿tiene acceso a todos los objetos de Python creados por el intérprete de Python? Si suponemos que las bibliotecas de Python C no tienen fugas, ¿debería boost […]

¿Cómo se agrega y elimina la recolección de basura Pythonic con una matriz numpy?

Estoy tratando de adaptar la estructura subyacente del código de trazado (matplotlib) que se actualiza en un temporizador para pasar de usar listas de Python para los datos de trazado a usar matrices numpy. Quiero poder reducir el tiempo para la ttwig lo más posible, y dado que los datos pueden llegar a los miles […]

multiprocesamiento y recolección de basura

En py2.6 +, el módulo de multiprocessing ofrece una clase de grupo, por lo que se puede hacer: class Volatile(object): def do_stuff(self, …): pool = multiprocessing.Pool() return pool.imap(…) Sin embargo, con la implementación estándar de Python en 2.7.2, este enfoque pronto lleva a “IOError: [Errno 24] Demasiados archivos abiertos”. Aparentemente, el objeto de la pool […]

¿Pueden las devoluciones de llamada `weakref` reemplazar a` __del__`?

¿Hay algún obstáculo que evite que weakref haga todo lo que __del__ hace pero con garantías mucho más fuertes (p. Ej., finalize garantías de que la llamada se realizará antes de que salga el intérprete, y el orden de las llamadas esté bien definido, etc.)? Parece que en el pasado lejano se pensó que una […]

Uso de memoria en la manipulación / procesamiento de grandes estructuras de datos.

Tengo varios archivos grandes (~ 100 Mb) que estoy procesando regularmente. Mientras trato de eliminar estructuras de datos innecesarias durante el procesamiento, el consumo de memoria es un poco demasiado alto. Me preguntaba si hay una manera de manipular eficientemente datos grandes, por ejemplo: def read(self, filename): fc = read_100_mb_file(filename) self.process(fc) def process(self, content): # […]

Forzar recolección de basura en Python para liberar memoria

Tengo una aplicación Python2.7 que usa muchos objetos dict que en su mayoría contienen cadenas para claves y valores. A veces, esos dados y cadenas ya no son necesarios y me gustaría eliminarlos de la memoria. Probé diferentes cosas, del dict[key] , del dict , etc. Pero la aplicación todavía usa la misma cantidad de […]

¿PyQT4 signal.connect mantiene los objetos en vivo?

Si tengo una señal y registro una función de objetos en la señal, ¿esto mantendrá el objeto vivo y detendrá la recolección de basura de ese objeto? P.ej class Signals(): signal = Qt.pyqtSignal() def __init__(self): QObject.__init__(self) class Test(); def __init__(self, s): s.connect(self.done) def done(self): print(“Done”) s = Signals() t = Test(s.signal) t = None s.signal.emit() […]

¿Cómo se recolecta la basura de la memoria en el motor de la aplicación (python) cuando se itera sobre los resultados de la base de datos?

Tengo un código que itera sobre las entidades de base de datos y se ejecuta en una tarea, vea a continuación. En el motor de la aplicación, memory_usage().current() Error de Exceeded soft private memory limit y, de hecho, al revisar memory_usage().current() confirma el problema. Vea a continuación la salida de la statement de registro. Parece […]

Entendiendo gc.get_referrers

Estoy tratando de rastrear una pérdida de memoria en Python (2.7). He encontrado gc.get_referrers, pero no entiendo la salida. Después de eliminar dying_node (que debería eliminar todas las referencias excepto una lista que he creado como parte de mi búsqueda), tengo en mi código: gc.collect() print “done dying: “, getrefcount(dying_node) #note, includes the reference from […]