Estoy escribiendo un rastreador de sistema de archivos personalizado, que pasa millones de globs para procesar a través de sys.stdin. Descubrí que cuando se ejecuta el script, su uso de memoria aumenta enormemente con el tiempo y todo se detiene prácticamente. He escrito un caso mínimo a continuación que muestra el problema. ¿Estoy haciendo algo mal o he encontrado un error en Python/el módulo glob? (Estoy usando Python 2.5.2).¿Por qué goteo la memoria con este ciclo de python?
#!/usr/bin/env python
import glob
import sys
import gc
previous_num_objects = 0
for count, line in enumerate(sys.stdin):
glob_result = glob.glob(line.rstrip('\n'))
current_num_objects = len(gc.get_objects())
new_objects = current_num_objects - previous_num_objects
print "(%d) This: %d, New: %d, Garbage: %d, Collection Counts: %s"\
% (count, current_num_objects, new_objects, len(gc.garbage), gc.get_count())
previous_num_objects = current_num_objects
La salida se ve así:
(0) This: 4042, New: 4042, Python Garbage: 0, Python Collection Counts: (660, 5, 0) (1) This: 4061, New: 19, Python Garbage: 0, Python Collection Counts: (90, 6, 0) (2) This: 4064, New: 3, Python Garbage: 0, Python Collection Counts: (127, 6, 0) (3) This: 4067, New: 3, Python Garbage: 0, Python Collection Counts: (130, 6, 0) (4) This: 4070, New: 3, Python Garbage: 0, Python Collection Counts: (133, 6, 0) (5) This: 4073, New: 3, Python Garbage: 0, Python Collection Counts: (136, 6, 0) (6) This: 4076, New: 3, Python Garbage: 0, Python Collection Counts: (139, 6, 0) (7) This: 4079, New: 3, Python Garbage: 0, Python Collection Counts: (142, 6, 0) (8) This: 4082, New: 3, Python Garbage: 0, Python Collection Counts: (145, 6, 0) (9) This: 4085, New: 3, Python Garbage: 0, Python Collection Counts: (148, 6, 0)
Cada iteración 100a, 100 objetos son liberados, por lo que len(gc.get_objects()
aumenta en 200 cada 100 iteraciones. len(gc.garbage)
nunca cambia de 0. El recuento de la colección de segunda generación aumenta lentamente, mientras que los recuentos 0º y 1º suben y bajan.
Esto se acumula una gran cantidad de objetos no cobrados. Sin embargo, esto no se detiene, ¿o sí? ¿Puedes crear un pequeño script similar que realmente se detenga? –