0

関数に次の 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 倍になりましたが、それでも同じ時点で爆発しました。

コードが原因でメモリ リークが発生するのはなぜですか? また、どのように修正すればよいですか?

4

2 に答える 2

1

IronPython には、オブジェクトが GC されるのを妨げるメモリ リークがどこかにあります。(これを教訓にしましょう。マネージ言語はメモリの問題から無縁ではありません。異なる問題を抱えているだけです。)しかし、どこにあるのかはわかりませんでした。

問題を作成して自己完結型の複製を添付することもできますが、メモリ プロファイラーに対してアプリを実行し、MyType オブジェクトに何が保持されているかを確認することをお勧めします。

于 2012-12-19T16:32:27.533 に答える
0

だから、私はまったく考えていなかったことがわかりました

ターゲット オブジェクト object には、行を追加する StringBuilder が含まれています。反復ごとに約 10 行なので、メモリが不足する前に StringBuilder に約 1 億 9000 万行のテキストを保持できるようです ;)

于 2012-12-19T23:56:23.153 に答える