Sto scrivendo un crawler di file system personalizzato, che riceve milioni di glob da elaborare tramite sys.stdin. Sto scoprendo che durante l'esecuzione della sceneggiatura, il suo utilizzo della memoria aumenta in modo massiccio nel tempo e l'intera struttura si ferma praticamente all'arresto. Ho scritto un caso minimale sotto il quale mostra il problema. Sto facendo qualcosa di sbagliato, o ho trovato un bug in Python/il modulo glob? (Sto usando python 2.5.2).Perché sto perdendo memoria con questo loop 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
Il risultato è simile:
(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)
Ogni iterazione 100, 100 oggetti vengono liberati, così len(gc.get_objects()
aumenta di 200 ogni 100 iterazioni. len(gc.garbage)
non cambia mai da 0. Il conteggio delle raccolte di 2a generazione aumenta lentamente, mentre i conteggi 0 ° e 1 ° aumentano e diminuiscono.
Questo si accumula un sacco di oggetti non ritirati. Tuttavia, questo non rallenta fino a fermarsi, vero? Riesci a elaborare un piccolo script simile che in realtà si ferma? –