2009-03-04 22 views
2

Ich hosste IronPython in einem C# -basierten WebService, um benutzerdefinierte Erweiterung Skripts bereitstellen zu können. Ich stelle jedoch fest, dass die Speichernutzung stark ansteigt, wenn ich einen einfachen Belastungstest durch wiederholtes Ausführen des Webservice in einer Schleife durchführe.IronPython Speichernutzung

IronPython-1.1 implementiert IDisposable auf seinen Objekten, so dass Sie sie entsorgen können, wenn sie fertig sind. Die neue IronPython-2-Engine auf Basis des DLR hat kein solches Konzept.

Von was ich verstanden habe, jedes Mal, wenn Sie ein Skript in der ScriptEngine ausführen, wird eine neue Assembly in die Appdomain injiziert und kann nicht entladen werden.

Gibt es einen Weg um dies zu umgehen?

Antwort

0

Es stellte sich heraus, nach aspnet_wp zu geht über 500mb, die Garbage Collector Tritte in und reinigt das Chaos aus. Die Speicherbelegung sinkt dann auf etwa 20 MB und beginnt während des Belastungstests stetig wieder anzusteigen. Also gibt es kein Speicherleck als solches.

+0

Sie interessieren sich für das Problem, das ich im letzten Jahr dem IP-Team vorlege. http://www.mail-archive.com/[email protected]/msg05771.html – Sake

1

Sie könnten versuchen, jedes Mal, wenn Sie eines Ihrer IronPython-Skripts ausführen, eine neue AppDomain zu erstellen. Obwohl Assemblies nicht aus dem Speicher entladen werden können, können Sie eine AppDomain entladen. Dadurch können Sie die injizierte Assembly aus dem Speicher holen.

1

Sie benötigen 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(); 
}