2

カスタム拡張スクリプトを提供できるように、ac# ベースの WebService で IronPython をホストしています。ただし、Web サービスをループで繰り返し実行して単純な負荷テストを行うと、メモリ使用量が急激に増加することがわかりました。

IronPython-1.1 は、そのオブジェクトに IDisposable を実装したので、それらが完了したら破棄できます。DLR に基づく新しい IronPython-2 エンジンには、そのような概念はありません。

私が理解したことから、ScriptEngine でスクリプトを実行するたびに、新しいアセンブリが appdomain に挿入され、アンロードできません。

これを回避する方法はありますか?

4

3 に答える 3

1

最適化されたコード生成を無効にする必要があります。

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();
}
于 2009-03-05T02:03:57.887 に答える
0

aspnet_wp が約 500 MB になると、ガベージ コレクターが作動して混乱を一掃します。その後、メモリ使用量は約 20 MB に低下し、負荷テスト中に再び着実に増加し始めます。したがって、メモリ「リーク」自体はありません。

于 2009-03-05T04:03:28.460 に答える