Frage

Ich bin Hosting Ironpython in einem c # -basierte WebService der Lage sein, Skripte bieten kundenspezifische Erweiterung. Aber ich finde, dass die Speichernutzung stark zunimmt, wenn ich durch die Ausführung des Webservice wiederholt in einer Schleife einfache Lasttests tun.

Ironpython-1.1 implementiert IDisposable auf seinen Objekten, so dass Sie über sie verfügen können, wenn sie fertig sind. Der neue Ironpython-2-Motor auf der Basis des DLR hat kein solches Konzept.

Von dem, was ich verstanden hat, jedes Mal führen Sie einen Skript in dem Script eine neue Baugruppe in der Appdomain injiziert wird und nicht entladen werden kann.

Gibt es eine Möglichkeit, um dieses?

War es hilfreich?

Lösung 3

Es stellte sich heraus, nach aspnet_wp zu geht über 500mb, die Garbage Collector Kicks und das Chaos reinigt. Der Speicherverbrauch sinkt dann auf etwa 20mb und beginnt wieder kontinuierlich während Belastungstests zu erhöhen. Es gibt also kein Gedächtnis ‚Leck‘ als solche.

Andere Tipps

Sie könnten versuchen, eine neue AppDomain zu schaffen jedes Mal, wenn einer Ihrer Ironpython-Skripte ausgeführt werden. Obwohl assebmlies kann nicht aus dem Speicher entfernt werden, können Sie eine AppDomain entladen und dies ermöglicht es Ihnen, die injizierte Baugruppe aus dem Speicher zu erhalten.

Sie müssen die optimierte Codegenerierung deaktivieren:

var runtime = Python.CreateRuntime();
var engine = runtime.GetEngine("py");
PythonCompilerOptions pco = (PythonCompilerOptions)engine.GetCompilerOptions();
pco.Module &= ~ModuleOptions.Optimized;

// this shouldn't leak now
while(true) {
   var code = engine.CreateScriptSourceFromString("1.0+2.0").Compile(pco);
   code.Execute();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top