Wer hat meinen Python-Speicher aufgegessen? [Duplikat]

9

Generische Frage zu Python-Code. Wie kann ich die schlimmsten Teile meines Python-Codes hinsichtlich der Speichernutzung am effektivsten lokalisieren?

Siehe z.B. Dieses kleine Beispiel

%Vor%

Wie kann ich auf automatisierte Weise sagen, dass a2 viel größer als a1 ist? Und wie kann ich - noch automatisiert - auf my_func1() und my_func2() zurückwachsen?

Für C / C ++ Code würde ich valgrind --tool=massif verwenden, was die Schwergewichte bezüglich der Speichernutzung direkt lokalisieren kann - aber für Python brauche ich Ihre Hilfe. Meliae scheint etwas von der Antwort zu geben, aber nicht annähernd so gut wie das Massiv für C / C ++.

    
Peter Toft 25.03.2014, 19:19
quelle

1 Antwort

0

local () (bzw. globals ()) gibt ein Dictionary mit allen lokalen (bzw. globalen) Alive-Objekten zurück. Sie können sie wie folgt verwenden:

%Vor%

Der Nachteil ist, dass Objekte, die __getsizeof__ nicht vollständig implementiert haben, wie Numpy-Arrays oder Referenzen, nicht erkannt werden. Zum Beispiel, wenn Sie:

%Vor%

Die Ausgabe ist:

%Vor%

Und natürlich wird gerade das Löschen von a1 seine 82 k nicht freigeben, weil es immer noch eine Referenz in a1 gibt. Aber wir können es noch seltsamer machen:

%Vor%

Und die Ausgabe wird seltsam vertraut aussehen:

%Vor%

Andere Tools implementieren möglicherweise Problemumgehungen und durchsuchen den Referenzbaum. Das allgemeine Problem einer vollständigen Speicheranalyse in Python bleibt jedoch ungelöst. Und dies wird gerade schlechter, wenn Objekte Daten über die C-API außerhalb des Bereichs des Referenzzählers speichern, der z. passiert mit Numpy-Arrays.

Das heißt, es gibt Werkzeuge, die für die meisten praktischen Situationen "gut genug" sind. Wie in dem Verweis, auf den verwiesen wird, ist Heapy eine sehr gute Option.

    
Davidmh 25.03.2014, 20:00
quelle

Tags und Links