Ich brauche Hilfe bei der Suche nach einer Lösung für ein Speicherleck, das ich habe. Ich habe eine C # -Anwendung (.NET v3.5), mit der ein Benutzer IronPython-Skripte zu Testzwecken ausführen kann. Die Skripte können verschiedene Module aus der Python-Standardbibliothek laden (wie in IronPython-Binärdateien enthalten). Wenn das Skript jedoch abgeschlossen ist, wird der Speicher, der den importierten Modulen zugewiesen wird, nicht als Garbage Collection erfasst. Das Durchlaufen mehrerer Durchläufe eines Skripts (durchgeführt für Stresstests) führt dazu, dass das System während der Langzeitnutzung nicht genügend Arbeitsspeicher zur Verfügung hat.
Hier ist eine vereinfachte Version von dem, was ich mache.
Hauptfunktion der Skriptklasse:
%Vor%Ein Beispiel 'test.py' Skript, das das zufällige Modul lädt (fügt ~ 1500 KB Speicher hinzu):
%Vor%Ein Schleifenmechanismus, der dazu führt, dass das System nicht genügend Arbeitsspeicher zur Verfügung hat:
%Vor%Ich habe den Abschnitt hinzugefügt, um die Kompilierung nicht basierend auf dem zu optimieren, was ich in gefunden habe dieser Thread, aber der Speicherverlust tritt in beide Richtungen auf. Das Hinzufügen des expliziten Aufrufs zu s.Dispose () macht ebenfalls keinen Unterschied (wie erwartet). Ich verwende derzeit IronPython 2.0, aber ich habe auch versucht, auf IronPython 2.6 RC2 ohne Erfolg zu aktualisieren.
Wie bekomme ich die importierten Module im eingebetteten IronPython-Skript wie gewöhnliche .NET-Objekte, wenn die Scripting Engine / Runtime den Gültigkeitsbereich verlässt?
mit Iron Python 2.6 RC 2 und C # 3.5
%Vor%und meine Schleife ist
%Vor% Die Speicherbelegung vonsteigt auf ca. 70.000 K an, wird dann jedoch wieder ausgeglichen.
Haben Sie versucht, den Iron Python in seiner eigenen appDomain auszuführen? Python.CreateEngine ermöglicht es Ihnen, eine AppDomain zu übergeben, die dann beim Abschluss des Skripts entladen werden kann.
Oder, basierend auf dieser Diskussion, verwenden Sie LightweightScopes Option, wie so
%Vor%Tags und Links memory-leaks .net ironpython