2008-08-29 9 views
143

Wie würden Sie herausfinden, wie viel Speicher von einem Objekt verwendet wird? Ich weiß, dass es möglich ist, herauszufinden, wie viel von einem Codeblock verwendet wird, aber nicht von einem instanziierten Objekt (zu jeder Zeit während seines Lebens), was ich möchte.Ermitteln, wie viel Speicher von einem Objekt in Python verwendet wird

+0

Ähnliche: http://stackoverflow.com/questions/449560/how-do-i-determine-the-size-of-an-object-in-python –

+0

Objgraph sieht interessant aus: http: // mg.pov .lt/objgraph/ –

+0

Grafischer Test: http://stackoverflow.com/a/30008338/2087463 – tmthydvnprt

Antwort

81

Es gibt keine einfache Möglichkeit, die Speichergröße eines Python-Objekts herauszufinden. Eines der Probleme, die Sie finden können, ist, dass Python-Objekte - wie Listen und Dicts - Verweise auf andere Python-Objekte haben können (in diesem Fall, was wäre Ihre Größe? Die Größe, die die Größe jedes Objekts enthält oder nicht?). Es gibt einige Verweise auf Overhead- und interne Strukturen, die sich auf Objekttypen und Garbage Collection beziehen. Schließlich haben einige Python-Objekte nicht offensichtliche Verhaltensweisen. Zum Beispiel reservieren Listen Speicherplatz für mehr Objekte als sie haben, die meiste Zeit; dicts sind noch komplizierter, da sie auf verschiedene Arten funktionieren können (sie haben eine andere Implementierung für eine kleine Anzahl von Schlüsseln und manchmal überschneiden sie Einträge).

Es gibt eine big chunk of code (und eine updated big chunk of code) da draußen zu versuchen, die Größe eines Python-Objekts im Speicher am besten zu nähern. Es gibt auch einige simpler approximations. Aber sie werden immer Annäherungen sein.

Sie können auch einige old description about PyObject (die interne C-Struktur, die praktisch alle Python-Objekte darstellt) überprüfen.

+6

@culix: Scheint so, dass jetzt wieder in der [Pympler] verwendet wird (http://pythonhosted.org/Pympler/) Modul. – FriendFX

+0

Link "Einfachere Annäherungen" ist unterbrochen - Haben Sie vor, auf [diese Nachricht] zu verlinken (https://mail.python.org/pipermail/python-list/2008-Januar/510696.html)? – Air

+0

Was ist, wenn Ihr Objekt ziemlich einfach ist, zB ein Diktat mit einem Int -> (Int, Int) 'Mapping? In der Theorie sollte die Berechnung der Größe eines solchen Objekts einfach sein, oder? –

4

Ich habe keine persönliche Erfahrung mit einem der folgenden, aber eine einfache Suche nach einem „Python [Speicher] Profiler“ Ausbeute:

  • PySizer „ein Speicher-Profiler für Python“ gefunden unter http://pysizer.8325.org/. Die Seite scheint jedoch anzuzeigen, dass das Projekt eine Zeit lang nicht aktualisiert wurde, und bezieht sich auf ...

  • Heapy, "Unterstützung [ing] Debuggen und Optimierung in Bezug auf Speicherprobleme in Python-Programmen" gefunden bei http://guppy-pe.sourceforge.net/#Heapy.

Hoffe, dass hilft.

23

Ein anderer Ansatz ist Gurke zu verwenden. Siehe this answer zu einem Duplikat dieser Frage.

+3

Das ist ein äußerst vernünftiger * und * einfacher Ansatz. –

+0

Ich bin sehr an Ihrer Antwort interessiert, kann aber nicht auf den Link zugreifen, auf den Ihre Antwort verweist ... –

+0

@YohanObadia Ich habe gerade den Link ausprobiert und es hat funktioniert ... Es ist eine weitere SO-Antwort. – drevicko

63

Try this:

sys.getsizeof(object) 

getsizeof() ruft das __sizeof__ Methode des Objekts und fügt einen zusätzlichen Garbage Collector Kopf wenn das Objekt vom Garbage Collector verwaltet wird.

A recursive recipe

+2

Enthält dieser Rückgabewert sys.getsizeof (object) die tatsächliche Objektgröße anstelle der Größe des Mauszeigers, wie oben beschrieben? –

+2

Nein, es wird die Größe des Zeigers zurückgegeben. – lstyls

2

Dies muss auf die Objekte mit Sorgfalt, da eine Überschreibung verwendet werden __sizeof__ irreführend sein könnte.

Mit der bregman.suite geben einige Tests mit sys.getsizeof eine Kopie eines Array-Objekts (Daten) in einer Objektinstanz als größer als das Objekt selbst (mfcc) aus.

>>> mfcc = MelFrequencyCepstrum(filepath, params) 
>>> data = mfcc.X[:] 
>>> sys.getsizeof(mfcc) 
64 
>>> sys.getsizeof(mfcc.X) 
>>>80 
>>> sys.getsizeof(data) 
80 
>>> mfcc 
<bregman.features.MelFrequencyCepstrum object at 0x104ad3e90> 
-2

Für große Objekte, die Sie eine etwas grobe, aber effektive Methode verwenden: überprüfen, wie viel Speicher Ihre Python-Prozess im System belegt, löschen Sie das Objekt und vergleichen.

Diese Methode hat viele Nachteile, aber es gibt Ihnen eine sehr schnelle Schätzung für sehr große Objekte.

+3

Dies ist wahrscheinlich nicht effektiv. In einem Prozess freigegebener Speicher muss nicht an das Betriebssystem zurückgegeben werden, daher ist die Suche nach einer Verringerung der Speicherbelegung möglicherweise nicht korrekt. –

+7

Ein ähnlicher Ansatz zur Messung der Python-Prozess-Ressourcennutzung vor der Erstellung des Objekts und danach wäre sehr effektiv. –

+1

Denke nicht, dass @AntonyHatchkins als Python-Speichermanager nicht unbedingt neuen Speicher von den Betriebssystemen bekommt. Bis zu einem gewissen Grad wird der Speicherpool auch dann zugewiesen, wenn er nicht verwendet wird. Wenn also eine neue Anforderung vorliegt, kann diese erfüllt werden, ohne dass mehr Speicher vom Betriebssystem angefordert werden muss. Mit anderen Worten, dieser Ansatz ist sowohl für die Erstellung als auch für die Zerstörung von Objekten unzuverlässig. – spider

Verwandte Themen