2013-01-08 18 views
7

Ich verwende pandas.DataFrame in einem Multi-Thread-Code (eigentlich eine benutzerdefinierte Unterklasse von DataFrame namens Sound). Ich habe bemerkt, dass ich ein Speicherleck habe, da die Speicherauslastung meines Programms allmählich über 10 Millionen steigt, um schließlich ~ 100% meines Computerspeichers zu erreichen und abzustürzen.Speicherleck mit Pandas Datenrahmen

verwendete ich objgraph zu versuchen, dieses Leck-Tracking, und fand heraus, dass die Anzahl der Fälle von MyDataFrame wird die ganze Zeit steigen, während es sollte nicht: jeder Thread in seiner run Methode eine Instanz schafft, macht einige Berechnungen, spart das Ergebnis in einer Datei und beendet ... also sollten keine Referenzen beibehalten werden.

Mit objgraph fand ich, dass alle Datenrahmen im Speicher ein ähnliches Referenzgraphen haben:

enter image description here

Ich habe keine Ahnung, ob das normal ist oder nicht ... es sieht aus wie das ist, was zu halten ist meine Objekte im Speicher. Irgendeine Idee, Rat, Einsicht?

+0

Ist es möglich, ein Kurzcode-Snippet zu integrieren, um dies zu replizieren? –

+0

Haben Sie versucht, den Garbage Collector manuell auszuführen? Wenn Sie Zirkelverweise haben, könnte dies erforderlich sein, um den Speicher freizugeben. 'importieren gc; gc.collect() ' – lgautier

Antwort

7

Bestätigt, dass in der Indizierungsinfrastruktur ein Speicherleck auftritt. Es ist nicht verursacht durch das obige Referenzdiagramm. Lassen Sie sich die Diskussion auf GitHub bewegen (SO ist für Q & A):

https://github.com/pydata/pandas/issues/2659

EDIT: dies scheint tatsächlich nicht zu einem Speicherverlust zu sein, aber hat vielleicht mit den OS-Speicherzuordnungsproblemen zu tun. Bitte werfen Sie einen Blick auf das Github-Problem für weitere Informationen.

+0

Ok ... das manuelle Sammeln mit GC scheint tatsächlich den Trick zu machen. Ich werde bestätigen, wenn ich mir sicher bin. – sebpiq

+0

Ok ich bestätige, das war das Problem ... Danke! – sebpiq

+0

Gibt es einen Grund, warum gen 2 gc nicht automatisch von der Python-Laufzeit ausgeführt wurde? – Fil