2009-02-10 8 views
30

Mögliche Duplizieren:
Python memory profilerWie kann ich Speicherlecks in meinem Python-Programm finden?

Ich habe eine ziemlich komplexe (etwa 20.000) Linie Python-Programm bekam die nach einiger Entwicklung begonnen hat, zunehmende Mengen an Speicher aufwendig, wenn es ausgeführt wird. Was sind die besten Werkzeuge und Techniken, um herauszufinden, wofür der gesamte Speicher verwendet wird?

Normalerweise kommt es darauf an, entweder Verweise auf Objekte oder Bugs von Erweiterungsmodulen zu behalten (was nicht besonders wahrscheinlich ist, da wir die Python 2.4-Installation eine Zeit lang benutzt haben).

Wir verwenden verschiedene Bibliotheken von Drittanbietern wie Twisted, Twisted Conch und MySQLdb.

+1

bitte schließen - das ist ein Duplikat –

+0

Es gab bereits eine [Frage] (http://stackoverflow.com/questions/110259/python-memory-profiler/110826) zu diesem Thema. – Seb

Antwort

1

Pythons Speicher wird von einem Garbage Collector verwaltet. Im Allgemeinen sollte es kein Problem mit Speicherleck geben (definitiv nicht für Python 2.5 und höher), es sei denn, Sie schreiben Erweiterungsmodul in C/C++. In diesem Fall könnte Valgrind (Blog post - http://bruynooghe.blogspot.com/2008/12/finding-memory-leaks-in-python.html) hilfreich sein. Ich habe festgestellt, dass diese Person - http://mg.pov.lt/blog/hunting-python-memleaks hat PDB und matplotlib verwendet, um ein Speicherleck zu verfolgen. Ich hoffe, das hilft, ich habe keine Erfahrung damit, Python-Speicherlecks zu beheben.

+15

In einem komplexen Programm behalten Sie manchmal einen Verweis auf ein Objekt, ohne es zu merken. Dadurch kann der Garbage Collector den Speicher nicht zurückfordern. Die Art und Weise, auf die Sebastjan damit verbunden ist, ist besser; Was ich wirklich will, ist zu sehen, wo mein Gedächtnis verwendet wird. –

+0

Danke für den Kommentar Dickon. Ich werde mir das merken. – batbrat

14

Im Allgemeinen ist das Schließen von Cursorn eine der häufigsten Arten von Speicherlecks. Der Garbage Collector kann die am Cursor beteiligten MySQL-Ressourcen nicht sehen. MySQL weiß nicht, dass die Python-Seite veröffentlicht wurde, es sei denn, die Methode close() wird explizit aufgerufen.

Faustregel. Öffnen Sie, verwenden Sie und schließen Sie Cursor in einer kurzen Codespanne, die Sie verwalten können.

+0

Ich habe versucht zu finden, warum mein System keine Ressourcen in einem Programm freigibt, und das war es genau. So eine kleine Sache, aber wenn Tausende von DB-Abfragen durchgeführt werden, wird es sehr schnell! – Shakesbeery

+0

Klingt so, als ob Sie eine With-Anweisung und eine RAII-ähnliche Klasse verwenden sollten, so dass Sie nicht vergessen können zu schließen, auch wenn Ausnahmen ausgelöst werden. –