Hallo Freunde,
ich habe im Forumsarchiv gesucht, aber meine Frage ist wohl zu speziell.
Das gegebene Problem ist ein bestehendes, recht umfangreiches Programm. Es verwendet unter anderem SQL-Alchemy und andere gekapselte third-party Pakete/Module. Offenbar hat das laufende Programm aber ein Speicherleck und nach wenigen Durchläufen ist der Speicher mit einigen Gigabyte Müll gefüllt.
Die Frage ist, wie kann man den Übeltäter aufspüren, insbesondere wenn er sich in den third-party Paketen verstecken sollte?
Es wurde schon versucht, mit sys.getrefcount zu prüfen, ob auch alle Referenzen auf die größten selbst geschriebenen Datenobjekte gelöscht wurden, was soweit der Fall war.
Welche Tools / Programms gibt es, die eine Ausführung des Scripts simulieren und dabei Speicherverbrauch und Inhalte von referenzierten Objekten übersichtlich darstellen? Evtl. das PyDev Plugin für Eclipse? Ich habe mal gehört, dass es solche Tools gibt, aber ich kann sie nicht finden.
Würde mich sehr freuen, wenn mir jemand helfen könnte.
Grüße,
Michael
Suche Python-Analysetool
- Michael Schneider
- User
- Beiträge: 569
- Registriert: Samstag 8. April 2006, 12:31
- Wohnort: Brandenburg
Diese Nachricht zersört sich in 5 Sekunden selbst ...
- Michael Schneider
- User
- Beiträge: 569
- Registriert: Samstag 8. April 2006, 12:31
- Wohnort: Brandenburg
Hallo,

Vielen Dank für die superschnelle Antwort, ich werde es testen (lassen).
Viele Grüße,
Michael
auf den ersten Blick würde ich sagen, das ist GENAU das, was ich suche (und irgendwann schonmal gesehen hatte).LivingOn hat geschrieben:vielleicht ist "Heapy" was Du suchst!?

Vielen Dank für die superschnelle Antwort, ich werde es testen (lassen).

Viele Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Hallo auch,
alternativ könntest Du es auch mit folgenden Tools probieren:
Colin
alternativ könntest Du es auch mit folgenden Tools probieren:
- cProfile
RunSnake
line_profiler
Colin
- Michael Schneider
- User
- Beiträge: 569
- Registriert: Samstag 8. April 2006, 12:31
- Wohnort: Brandenburg
Hallo nochmal,
zur Auflösung: Heapy hat uns auf die Spur gebracht.
Der Kollege hat Attribute eines ORM-Objekts von SQLAlchemy über __dict__ direkt gesetzt. Mir fiel das schon ins Auge, weil ich wusste, dass SQLA vieles über Properties oder Setter/Getter macht. Es gab aber keinen Fehler und das Programm lief an den besagten Stellen korrekt. Offenbar wird das Attribut bei Verwendung der Setter aber gesondert gespeichert und nur dann wird das Objekt beim Verwerfen des Namens auch korrekt (und vollständig) zerstört.
Danke auch für die anderen Vorschläge! Die werde ich mir auch ansehen und in geeigneten Fällen verwenden.
Gruß,
Michael
zur Auflösung: Heapy hat uns auf die Spur gebracht.
Der Kollege hat Attribute eines ORM-Objekts von SQLAlchemy über __dict__ direkt gesetzt. Mir fiel das schon ins Auge, weil ich wusste, dass SQLA vieles über Properties oder Setter/Getter macht. Es gab aber keinen Fehler und das Programm lief an den besagten Stellen korrekt. Offenbar wird das Attribut bei Verwendung der Setter aber gesondert gespeichert und nur dann wird das Objekt beim Verwerfen des Namens auch korrekt (und vollständig) zerstört.
Danke auch für die anderen Vorschläge! Die werde ich mir auch ansehen und in geeigneten Fällen verwenden.
Gruß,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
- Michael Schneider
- User
- Beiträge: 569
- Registriert: Samstag 8. April 2006, 12:31
- Wohnort: Brandenburg
Ich möchte sagen, dass ich in der SQLAlchemy Doku (vor Jahren mal) gelesen habe, dass man die Attributzuweisung verwenden und die __dict__-Manipulation vermeiden soll. Das kann ich aber auch mit einer der vielen anderen Dokumentationen verwechseln, die ich schon gelesen habe, ich bin da nie so tief eingestiegen und bin mir daher nicht ganz sicher.snafu hat geschrieben:Eventuell lohnt es sich, in der Hinsicht mal einen Bugreport an die Entwickler von SQLAlchemy zu schreiben...
Ich gehe aber davon aus, dass ein Bugreport unangebracht ist, wenn ein solcher Hinweis in der Dokumentation zu finden ist, oder sollte man in solchen Fällen eine Exception erwarten? Kann man einen Zugriff auf instance.__dict__ überhaupt abfangen?
Gruß,
Micha
Diese Nachricht zersört sich in 5 Sekunden selbst ...