2016-06-14 33 views
2

Ich denke, dass ich einen Speicherverlust beim Laden eines .yml file mit der Bibliothek PyYAML habe.Speicherleck mit PyYAML

Ich habe die nächsten Schritte folgen:

import yaml 
d = yaml.load(open(filename, 'r')) 

Der Speicher von dem verwendeten Verfahren (ich habe es mit top oder htop bekommen) 60K-160M, während die Größe der Datei niedriger ist gewachsen als 1M.

Dann habe ich den nächsten Befehl:

sys.getsizeof(d) 

Und es hat einen Wert von weniger als 400K zurückgegeben.

Ich habe auch versucht, den Müllsammler mit gc.collect() zu verwenden, aber nichts ist passiert.

Wie Sie sehen können, scheint es, dass es ein Speicherleck gibt, aber ich weiß nicht, was es produziert, noch weiß ich, wie man diese Menge an Speicher freigibt.

Irgendeine Idee?

Antwort

0

Ihr Ansatz zeigt keinen Speicherverlust, es zeigt nur, dass PyYAML viel Speicher verwendet, während eine YAML-Datei mittlerer Größe verarbeitet wird.

Wenn Sie tun würde:

import yaml 
X = 10 
for x in range(X): 
    d = yaml.load(open(filename, 'r')) 

Und die Speichergröße von dem Programm verwendet würde je nach ändern, was Sie setzen X zu, dann gibt es Grund gibt anzunehmen, ist ein Speicherleck.

In Tests, die ich ausgeführt habe, ist dies nicht der Fall. Es ist nur so, dass die Standard-Loader und SafeLoader etwa 330x die Dateigröße im Speicher (basierend auf einer beliebigen 1Mb-Größe einfach, d. H. Keine Tags, YAML-Datei) und der CLoader etwa 145x dieser Dateigröße benötigen.

Das mehrfache Laden der YAML-Daten erhöht das nicht, also gibt load() den Speicher zurück, den es verwendet, was bedeutet, dass kein Speicherleck vorhanden ist.

Das soll nicht heißen, dass es wie eine enorme Menge an Overhead aussieht.