2009-03-04 17 views
2

私はIronPythonをC#ベースのWebServiceでホストしており、カスタム拡張スクリプトを提供できます。しかし、ループを繰り返してwebserviceを実行することで単純な負荷テストを行うと、メモリ使用量が急増することがわかりました。IronPythonのメモリ使用量

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

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

これを回避する手段はありますか?

答えて

0

はaspnet_wp約500メガバイトになった後、ガベージコレクタがで蹴り、混乱を一掃、判明。その後、メモリ使用量は約20MBに低下し、ロードテスト中に着実に増加し始めます。 そういうわけで、メモリリークはありません。

+0

私は昨年、IPチームに提出した問題に興味がありました。 http://www.mail-archive.com/[email protected]/msg05771.html – Sake

1

IronPythonスクリプトのいずれかを実行するたびに新しいAppDomainを作成できます。 assebmliesをメモリからアンロードすることはできませんが、AppDomainをアンロードできます。これにより、注入されたアセンブリをメモリから取り出すことができます。

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(); 
}