Frage

Ich möchte die Speichernutzung meiner Python-Anwendung kennen und wollen genau wissen, welche Codeblöcke / Teile oder Objekte sind die meisten Speicher verbrauchen. Google-Suche zeigt eine kommerzielle Python Speicher Validator (nur Windows) ist.

Und Open-Source-diejenigen sind PySizer und Heapy .

Ich habe jemand nicht versucht, so wollte ich wissen, welches das beste bedenkt, ist:

  1. Gibt die meisten Details.

  2. Ich habe am wenigsten oder gar keine Änderungen an meinen Code zu tun.

War es hilfreich?

Lösung

Heapy ist ganz einfach zu bedienen. An einem gewissen Punkt in Ihrem Code, müssen Sie schreiben folgendes:

from guppy import hpy
h = hpy()
print h.heap()

Das gibt Ihnen eine Ausgabe wie folgt aus:

Partition of a set of 132527 objects. Total size = 8301532 bytes.
Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
0  35144  27  2140412  26   2140412  26 str
1  38397  29  1309020  16   3449432  42 tuple
2    530   0   739856   9   4189288  50 dict (no owner)

Sie können auch von herauszufinden, wo Objekte referenziert werden, und Statistiken über das bekommen, aber irgendwie die Dokumentation auf dieser sind etwas spärlich.

Es ist ein grafischer Browser als auch, geschrieben in Tk.

Andere Tipps

Da niemand erwähnt hat werde ich zu meinem Modul zeigen memory_profiler , die in der Lage ist Druck line-by-line Bericht der Speichernutzung und arbeitet auf Unix und Windows (benötigt psutil auf diesem letzten). Die Ausgabe ist nicht sehr detailliert, aber das Ziel ist es, Ihnen einen Überblick, wo der Code höheren Speicherbedarf und keine erschöpfende Analyse auf zugeordneten Objekte.

Nach Ihrer Funktion mit @profile Dekoration und Ihren Code mit der -m memory_profiler Flagge läuft es wird eine Zeile-für-Zeile-Bericht wie folgt drucken:

Line #    Mem usage  Increment   Line Contents
==============================================
     3                           @profile
     4      5.97 MB    0.00 MB   def my_func():
     5     13.61 MB    7.64 MB       a = [1] * (10 ** 6)
     6    166.20 MB  152.59 MB       b = [2] * (2 * 10 ** 7)
     7     13.61 MB -152.59 MB       del b
     8     13.61 MB    0.00 MB       return a

Ich empfehle Dowser . Es ist sehr einfach zu installieren, und Sie müssen Null Änderungen an Ihrem Code. Sie können Zählungen von Objekten jeder Art durch die Zeit, Ansicht Liste der Live-Objekte, uuml sehen Objekte zu leben, die alle von dem einfachen Web-Interface.

# memdebug.py

import cherrypy
import dowser

def start(port):
    cherrypy.tree.mount(dowser.Root())
    cherrypy.config.update({
        'environment': 'embedded',
        'server.socket_port': port
    })
    cherrypy.server.quickstart()
    cherrypy.engine.start(blocking=False)

Sie importieren memdebug und rufen memdebug.start. Das ist alles.

Ich habe PySizer oder Heapy nicht versucht. Ich würde andere Kritiken zu schätzen wissen.

UPDATE

Der obige Code ist für CherryPy 2.X, CherryPy 3.X die server.quickstart Methode wurde entfernt, und engine.start nehmen nicht die blocking Flagge. Also, wenn Sie mit CherryPy 3.X

# memdebug.py

import cherrypy
import dowser

def start(port):
    cherrypy.tree.mount(dowser.Root())
    cherrypy.config.update({
        'environment': 'embedded',
        'server.socket_port': port
    })
    cherrypy.engine.start()

Betrachten Sie die objgraph Bibliothek (siehe http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks für ein Beispiel Anwendungsfall) .

Muppy ist (weitere) Speichernutzung Profiler für Python. Der Schwerpunkt dieses Toolset auf der Identifizierung von Speicherlecks gelegt wird.

Muppy versucht Entwickler Identitätsspeicherlecks von Python-Anwendungen. Es ermöglicht die Verfolgung der Speichernutzung während der Laufzeit und die Identifizierung von Objekten, die undicht werden. Zusätzlich Werkzeuge vorgesehen sind, die die Quelle nicht freigegeben Objekte lokalisieren lassen.

Ich fand Meliaden wesentlich funktioneller als Heapy oder PySizer. Wenn Sie einen wsgi Webapp läuft, dann Dozer ist eine nette Middleware-Wrapper von Dowser werden passieren

Ich bin für Python einen Speicher-Profiler Entwicklung genannt memprof:

http://jmdana.github.io/memprof/

Es ermöglicht Ihnen, die Speichernutzung Ihrer Variablen während der Ausführung der dekorierten Methoden zu protokollieren und grafisch darzustellen. Sie müssen nur die Bibliothek importieren mit:

from memprof import memprof

Und dekorieren Sie Ihre Methode:

@memprof

Dies ist ein Beispiel dafür, wie die Diagramme wie folgt aussehen:

eingeben Bild Beschreibung hier

Das Projekt wird in GitHub:

https://github.com/jmdana/memprof

Versuchen Sie auch die pytracemalloc Projekt , die die Speichernutzung pro Python Zeilennummer liefert.

EDIT (2014/04): Es hat jetzt ein Qt-GUI-Snapshots zu analysieren

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