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
Antwort
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.
@culix: Scheint so, dass jetzt wieder in der [Pympler] verwendet wird (http://pythonhosted.org/Pympler/) Modul. – FriendFX
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
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? –
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.
Ein anderer Ansatz ist Gurke zu verwenden. Siehe this answer zu einem Duplikat dieser Frage.
Das ist ein äußerst vernünftiger * und * einfacher Ansatz. –
Ich bin sehr an Ihrer Antwort interessiert, kann aber nicht auf den Link zugreifen, auf den Ihre Antwort verweist ... –
@YohanObadia Ich habe gerade den Link ausprobiert und es hat funktioniert ... Es ist eine weitere SO-Antwort. – drevicko
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.
Enthält dieser Rückgabewert sys.getsizeof (object) die tatsächliche Objektgröße anstelle der Größe des Mauszeigers, wie oben beschrieben? –
Nein, es wird die Größe des Zeigers zurückgegeben. – lstyls
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>
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.
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. –
Ein ähnlicher Ansatz zur Messung der Python-Prozess-Ressourcennutzung vor der Erstellung des Objekts und danach wäre sehr effektiv. –
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
- 1. Wie viel Speicher wird von Mondrian verwendet?
- 2. Finden Sie heraus, wie viel Speicher von einem Objekt in C# verwendet wird?
- 3. Ermitteln von Speicher von ASP.net-Cache in Shared-Hosting verwendet
- 4. Wie viel Speicher verwendet PHP tatsächlich?
- 5. Wie viel Speicher verwendet eine Nashorn ScriptEngine?
- 6. Wie viel Speicher verwendet eine Hashtable?
- 7. Python-Skript weiß, wie viel Speicher es verwendet
- 8. Solr verwendet zu viel Speicher
- 9. Wie viel Speicher verwendet mein Kernelmodul?
- 10. Nashorn Speicherleck Viel Speicher wird von jdk.nashorn.internal.scripts.JO4P0
- 11. Wie viel Speicher verwendet ein C++ Zeiger?
- 12. Verwendet die GD-Bibliothek viel Speicher?
- 13. Java .jar verwendet zu viel Speicher
- 14. jquery Skript verwendet zu viel Speicher
- 15. Speicher, der von einem Prozess unter Mac OS verwendet wird
- 16. Elasticsearch, das aufgrund von Groovy-Skripts viel Speicher verwendet
- 17. Fragment Backstack verwendet zu viel Speicher
- 18. Wird GObject viel außerhalb von GNOME verwendet?
- 19. Ermitteln, welcher Webserver verwendet wird
- 20. Bestimmen Sie, wie viel Speicher eine Klasse verwendet?
- 21. JSON.parse() auf einem großen Array von Objekten verwendet viel mehr Speicher als es sollte
- 22. Speicher aus einem C# -Objekt
- 23. Wie töte ich automatisch einen Prozess, der zu viel Speicher mit Python verwendet?
- 24. Wie viel Speicher verwendet ein Java-Objekt, wenn alle seine Mitglieder null sind?
- 25. Wo wird Python verwendet? Ich habe viel über Reddit gelesen
- 26. Python-Objekt im Speicher komprimieren
- 27. Warum benötigen Ints in Python dreimal so viel Speicher?
- 28. Wie viel RAM verwendet SQL Server tatsächlich?
- 29. Wie kann free() wissen, wie viel Speicher freigegeben wird?
- 30. Wie viel Speicher sollte "managed_shared_memory" zuweisen? (Boost)
Ähnliche: http://stackoverflow.com/questions/449560/how-do-i-determine-the-size-of-an-object-in-python –
Objgraph sieht interessant aus: http: // mg.pov .lt/objgraph/ –
Grafischer Test: http://stackoverflow.com/a/30008338/2087463 – tmthydvnprt