Ich kämpfe mit einem Speicherleck in einem Python-Projekt und habe schon viel Zeit damit verbracht. Ich habe das Problem auf ein kleines Beispiel zurückgeführt. Jetzt scheine ich die Lösung zu kennen, aber ich kann nicht verstehen なぜ .
import random
def main():
d = {}
used_keys = []
n = 0
while True:
# choose a key unique enough among used previously
key = random.randint(0, 2 ** 60)
d[key] = 1234 # the value doesn't matter
used_keys.append(key)
n += 1
if n % 1000 == 0:
# clean up every 1000 iterations
print 'thousand'
for key in used_keys:
del d[key]
used_keys[:] = []
#used_keys = []
if __name__ == '__main__':
main()
Die Idee ist, dass ich einige Werte in dem Diktat d
und merken Sie sich die benutzten Tasten in einer Liste, um das Diktat von Zeit zu Zeit reinigen zu können.
Diese Variante des Programms frisst munter Speicher und gibt ihn nicht wieder zurück. Wenn ich eine alternative Methode zum "Löschen" verwende used_keys
die im Beispiel kommentiert ist, ist alles in Ordnung: Der Speicherverbrauch bleibt konstant.
Warum?
Getestet auf CPython und vielen Linuxen.