Seite 1 von 1

memory problem

Verfasst: Mittwoch 25. März 2009, 18:23
von thomas15
hallo schlangenbeschwoerer,

ich habe ein speicherproblem in meinem python program und dachte dass ich mich an versiertere pythonianer wende die vielleicht ein how to kennen was mir weiterhilft.

meine python - swig schnitstelle verwaltet c++ klassen (3D volumen) und laest allerhand algorithmen auf diese los.
bei einer methode habe ich festgestellt dass sie den speicher zukleistert und irgendwo einen speicherteil nicht freigibt, und somit bei wiederholung das ganze system einfriert weil der speicher aus ist.
also ein klassisches memory leak das man bei c++ mit valgrind finden wuerde.
da ich aber nun mein algorithmus in python habe frage ich mich wie ich am besten den speicher ueberwachen koennte um mein leak zu finden.
gibts python tools die sowas koennen?
valgrind dumpt leider nicht den python code mit in sein protokoll wenn man es wie folgt aufruft:

valgrind --tool=memcheck --suppressions=./python.supp --leak-resolution=high --leak-check=full --show-reachable=yes --log-file=val1 python tmp &

es sieht so aus als wuerden ein paar python-objekte herrenlos im speicher rumschwirren die nur bei ende von python selbst freigegeben werden. (garbage collector oder aehnliches)

das problem ist recht komplex, deswegen waer es cool wenn ihr allgemeine antworten / links haettet... (wenn ueberhaupt)

danke schonmal fuer die hilfe,
thomas

Verfasst: Mittwoch 25. März 2009, 18:39
von Leonidas
Auf reddit trifft man ab und zu auf einen Artikel zu dem Thema.

Verfasst: Donnerstag 26. März 2009, 15:14
von CM
Abgesehen von den vielen Verweisen auf das gc-Modul: Damit kommst Du ja nur weiter, wenn SWIG einen Fehler gemacht hat. Aber SWIG wird sich ja nur um einen Teil der Werte (Eingabe / Rückgabe) der Funktionen kümmern. Wenn der Leak in einer Funktion ist, bist Du mit gc aufgeschmissen. Den Zugang mit valgrind erhälst Du aber rel. einfach bei purem C++ Code: Schreibe doch einfach eine main()-Routine, in der Du Deine Funktionen mit Dummy-Daten fütterst und kompiliere per Hand.

Gruß,
Christian