質問
カスタム拡張スクリプトを提供できるように、c#ベースのWebServiceでIronPythonをホストしています。ただし、ループ内でWebサービスを繰り返し実行して単純な負荷テストを行うと、メモリ使用量が急激に増加することがわかりました。
IronPython-1.1は、オブジェクトにIDisposableを実装したため、完了したら破棄できます。 DLRに基づく新しいIronPython-2エンジンには、このような概念はありません。
私が理解したことから、ScriptEngineでスクリプトを実行するたびに、新しいアセンブリがappdomainに挿入され、アンロードできません。
これを回避する方法はありますか?
解決 3
aspnet_wpが約500MBに達すると、ガベージコレクターが起動して混乱を解消します。その後、メモリ使用量は約20MBに低下し、負荷テスト中に着実に増加し始めます。 そのため、メモリの「リーク」はありません。
他のヒント
IronPythonスクリプトの1つを実行するたびに、新しいAppDomainを作成してみてください。アセンブリをメモリからアンロードすることはできませんが、AppDomainをアンロードできます。これにより、挿入されたアセンブリをメモリから取得できます。
最適化されたコード生成を無効にする必要があります:
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();
}
所属していません StackOverflow