2016-06-02 4 views
2

Sieht aus wie Garbage Collector sammelt nicht die Werte pop 'd aus der dict() in Python 2.7 (nicht auf Python 3 versucht). Hier ist das Beispiel:dict Pop nicht den Speicher frei

a = dict() 

# fill the memory (dict) 
for i in xrange(0, 9999999): 
    a[i] = i 

# Memory usage is about 600 MB 
# try to free the memory 
for i in xrange(0, 9999999): 
    a.pop(i) 

# print the dict and see it is empty 
print "%r" % a 
# prints: {} 
# Memory usage is about 600 MB 

import copy 
a = copy.copy(a) 
# Memory usage decreased to about 200 MB 

import gc 
gc.collect() 
# Memory usage decreased to about 10 MB  

Jeder weiß, warum dies passiert und wie dieses Speicherleck Problem zu lösen?

+0

Wie haben Sie die Speichernutzung gemessen? – Daniel

+0

mit 'top' Befehl –

+0

Warum verwenden Sie' pop' anstatt 'del'? –

Antwort

4

Es gibt kein Speicherverlustproblem, da der Speicher freigegeben wird, wenn das Wörterbuch nicht mehr verwendet wird. Wörterbücher verwenden interne Tabellen zum Speichern der Einträge. Diese Tabellen werden bei Verwendung von pop nicht freigegeben, da jeder Schlüssel einer Hash-Modulogröße der internen Tabelle zugeordnet ist. Der letzte vorhandene Schlüssel könnte also am Ende dieser Tabelle liegen.

Um dies zu veranschaulichen, werde ich sys.getsizeof verwenden:

>>> a= {} 
>>> sys.getsizeof(a) 
288 
>>> for i in range(9999999): a[i]=i 
... 
>>> sys.getsizeof(a) 
402653280 
>>> for i in range(9999999): del a[i] 
... 
>>> sys.getsizeof(a) 
402653280 
>>> a = copy.copy(a) 
>>> sys.getsizeof(a) 
288 
>>> 

Statt übermäßige pop s verwenden, sollten Sie neue Wörterbücher bei Bedarf erstellen.

+0

Ich wiederholte dieses Experiment mit einer Liste 'a = []' und 'a.pop()' und es sieht so aus, als ob es in diesem Fall Speicher frei macht, klingt das richtig? – pinhead

Verwandte Themen