質問

カスタム拡張スクリプトを提供できるように、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();
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top