Wie viel Zeit benötigt der Garbage Collector?

8

Mein Python-Programm hat ein seltsames Verhalten: Je länger es läuft, desto langsamer wird es. Schon früh werden Dutzende von Arbeitseinheiten pro Minute freigesetzt. Nach einer Stunde dauert es also einige zehn Minuten pro Arbeitseinheit. Mein Verdacht ist, dass dies durch einen verstopften Müllsammler verursacht wird.

Der Haken ist, dass mein Skript zu speicherhungrig ist, als dass cProfile in großen Läufen arbeiten könnte. (Siehe: cProfile nimmt viel Speicher in Anspruch )

Wir haben unser eigenes Performance-Plugin geschrieben, und wir können die meisten Teile unseres Systems beobachten, und keines von ihnen scheint das Problem zu sein. Der einzige Stein, der noch nicht gedreht wurde, ist der GC.

Gibt es einen anderen Weg (neben Profil oder cProfile), um zu sehen, wie viel Zeit für den GC benötigt wird?

    
Matthew Scouten 24.05.2011, 18:27
quelle

1 Antwort

6

In Python wird der meiste Müll durch Referenzzählung gesammelt. Man würde erwarten, dass dies schnell und schmerzlos ist, und es scheint unwahrscheinlich, dass dies das ist, wonach Sie suchen. Ich nehme an, Sie fragen nach dem Kollektor, auf den das gc -Modul verweist, das nur für den Umlauf verwendet wird Referenzen.

Es gibt ein paar Dinge, die nützlich sein könnten: Ссылка

Obwohl es offenbar keine direkte Methode für Zeit gibt, können Sie den Garbage Collector ein- und ausschalten, das Debugging aktivieren, die Anzahl der Sammlungen überprüfen usw. All dies ist hilfreich in deiner Suche.

Auf meinem System gibt gc beispielsweise die verstrichene Zeit aus, wenn Sie die Debug-Flags aktivieren:

%Vor%

All dies beiseite, das erste, was ich mir ansehen würde, ist die Entwicklung der Speichernutzung Ihres Programms während es läuft. Eine Möglichkeit ist, dass es einfach die Grenze des verfügbaren physischen RAM erreicht und aufgrund exzessiver Seitenfehler langsamer wird als aufgrund von irgendetwas, das mit dem Garbage Collector zu tun hat.

    
NPE 24.05.2011, 18:43
quelle