Frage

Auf diese Frage gibt es hier bereits eine Antwort:

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 verbraucht wird, nicht jedoch von einem instanziierten Objekt (jederzeit während seiner Lebensdauer), was ich möchte.

War es hilfreich?

Lösung

Es gibt keine einfache Möglichkeit, die Speichergröße eines Python-Objekts herauszufinden.Eines der Probleme, auf die Sie möglicherweise stoßen, besteht darin, dass Python-Objekte – wie Listen und Diktate – Verweise auf andere Python-Objekte haben können (wie groß wäre in diesem Fall Ihre Größe?Die Größe enthält die Größe jedes Objekts oder nicht?).Es gibt einige Zeiger-Overheads und interne Strukturen, die sich auf Objekttypen und Garbage Collection beziehen.Schließlich weisen einige Python-Objekte nicht offensichtliche Verhaltensweisen auf.Beispielsweise reservieren Listen meistens Platz für mehr Objekte, als sie haben.Diktate sind sogar noch komplizierter, da sie auf unterschiedliche Weise funktionieren können (sie haben eine unterschiedliche Implementierung für eine kleine Anzahl von Schlüsseln und weisen manchmal zu viele Einträge zu).

Da ist ein großer Codeblock (und ein großer Teil des Codes aktualisiert) verfügbar, um zu versuchen, die Größe eines Python-Objekts im Speicher bestmöglich zu approximieren.

Vielleicht möchten Sie auch einige davon überprüfen alte Beschreibung über PyObject (die interne C-Struktur, die praktisch alle Python-Objekte darstellt).

Andere Tipps

Versuche dies:

sys.getsizeof(object)

getsizeof() ruft das Objekt auf __sizeof__ -Methode und fügt einen zusätzlichen Garbage-Collector-Overhead hinzu Wenn Das Objekt wird vom Garbage Collector verwaltet.

Ein rekursives Rezept

Ein anderer Ansatz ist die Verwendung von Essiggurken.Sehen diese Antwort zu einem Duplikat dieser Frage.

Ich habe mit keinem der folgenden Punkte persönliche Erfahrungen, aber eine einfache Suche nach einem „Python [Speicher]-Profiler“ ergibt:

  • PySizer, „ein Speicherprofiler für Python“, gefunden unter http://pysizer.8325.org/.Die Seite scheint jedoch darauf hinzuweisen, dass das Projekt seit einiger Zeit nicht mehr aktualisiert wurde, und bezieht sich auf ...

  • Heapy, „Unterstützung beim Debuggen und Optimieren in Bezug auf speicherbezogene Probleme in Python-Programmen“, gefunden unter http://guppy-pe.sourceforge.net/#Heapy.

Hoffentlich hilft das.

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

Unter Verwendung 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>

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top