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
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.
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.
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.
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!
Tags und Links python multithreading profiling memory-profiling