関数に次の 2 行がある C# クラスに IronPython コードがあります。
void test(MyType request){
compiledCode.DefaultScope.SetVarialbe("target", request);
compiledCode.Execute();
}
これをストレステスト/パフォーマンステストするコードを書いていました。私が渡しているリクエスト オブジェクトはList<MyType>
100 万MyType
の です。だから私はこのリストを繰り返します:
foreach(MyType thing in myThings){
test(thing);
}
そして、それは問題なく動作します-約6秒で実行されます。私が走るとき
for(int x = 0; x < 1000; x++){
foreach(MyType thing in myThings){
test(thing);
}
}
ループの 19 回目の反復で、OutOfMemoryException
.
代わりにやってみPython.CreateEngine(AppDomain.CurrentDomain)
ましたが、効果がないようで、試しました
...
compiledCode.Execute();
compiledCode.DefaultScope.RemoveVariable("target");
どういうわけか IronPython が参照を維持していることを願っています。かかった時間は約 2 倍になりましたが、それでも同じ時点で爆発しました。
コードが原因でメモリ リークが発生するのはなぜですか? また、どのように修正すればよいですか?