Wie kann ich den Speicher des Multithread-Programms in Python profilieren?

8

Gibt es eine Möglichkeit, den Speicher eines Multithread-Programms in Python zu profilieren?

Für CPU-Profiling verwende ich das cProfile, um separate Profiler-Statistiken für jeden Thread zu erstellen und sie später zu kombinieren. Ich habe jedoch keine Möglichkeit gefunden, dies mit Speicherprofilern zu tun. Ich verwende Heapy.

Gibt es eine Möglichkeit, Stats in Heapy wie das cProfile zu kombinieren? Oder was andere Speicher Profiler würden Sie vorschlagen, dass für diese Aufgabe besser geeignet ist.

Eine ähnliche Frage wurde gestellt, um die CPU-Nutzung über ein Multi-Thread-Programm zu profilieren: Wie kann ich ein Multithread-Programm in Python profilieren?

Eine weitere Frage zum Speicherprofiler: Python-Speicherprofiler

    
Utku Zihnioglu 25.01.2011, 21:41
quelle

4 Antworten

7

Wenn Sie gerne Objekte und nicht rohen Speicher profilieren möchten, können Sie die gc.get_objects() verwenden Funktion, so dass Sie keine benutzerdefinierte Metaklasse benötigen. In neueren Python-Versionen können Sie mit sys.getsizeof() auch herausfinden, wie viel darunter liegt Speicher wird von diesen Objekten verwendet.

    
ncoghlan 14.02.2011, 02:00
quelle
3

Es gibt Möglichkeiten, Valgrind zum Profilspeicher von Python-Programmen zu bringen: Ссылка

    
Foo Bah 07.02.2011 05:12
quelle
1

Ok. Was ich genau suchte, scheint nicht zu existieren. Also habe ich eine Lösung gefunden - eine Umgehung für dieses Problem.

Anstatt den Speicher zu profilieren, profiliere ich Objekte. Auf diese Weise kann ich sehen, wie viele Objekte zu einem bestimmten Zeitpunkt im Programm existieren. Um mein Ziel zu erreichen, verwendete ich Metaklassen mit minimalen Modifikationen an bereits existierendem Code.

Die folgende Metaklasse fügt den Funktionen __init__ und __del__ der Klasse eine sehr einfache Unterroutine hinzu. Die Unterroutine für __init__ erhöht die Anzahl der Objekte mit diesem Klassennamen um eins und die __del__ um eins.

%Vor%

Die Funktionen incAndCall und decAndCall verwenden die globale Variable des Moduls, in dem sie existieren.

%Vor%

Die dummyFunction ist nur eine sehr einfache Problemumgehung. Ich bin mir sicher, dass es viel bessere Möglichkeiten dafür gibt.

Schließlich, wenn Sie die Anzahl der vorhandenen Objekte sehen möchten, müssen Sie sich nur das Counter-Dictionary ansehen. Ein Beispiel;

%Vor%

Ich hoffe, das hilft dir. Es war ausreichend für meinen Fall.

    
Utku Zihnioglu 13.02.2011 23:36
quelle
0

Ich habe Yappi verwendet, mit dem ich in einigen speziellen Multithread-Fällen erfolgreich war. Es hat großartige Dokumentation, so dass Sie nicht zu viel Mühe haben sollten, es einzurichten.

Weitere Informationen zur speicherspezifischen Profilerstellung finden Sie Heapy . Seien Sie gewarnt, es kann einige der größten Protokolldateien erstellen, die Sie jemals gesehen haben!

    
KushalP 18.02.2011 17:31
quelle