0

我在 C# 类中有一些 IronPython 代码,该类在函数中有以下两行:

void test(MyType request){
    compiledCode.DefaultScope.SetVarialbe("target", request);
    compiledCode.Execute();
}

我正在编写一些代码来对此进行压力测试/性能测试。我传入的请求对象是List<MyType>一百万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 以某种方式保留参考。这大约是它花费的时间的两倍,但它仍然在同一时间爆炸。

为什么我的代码会导致内存泄漏,我该如何解决?

4

2 回答 2

1

IronPython 在某处存在内存泄漏,阻止了对象被 GC 处理。(让这成为一个教训,孩子们:托管语言不能免受内存问题的影响。它们只是有不同的问题。)不过,我无法弄清楚在哪里。

您可以创建一个问题并附加一个自包含的复制品,但更好的是针对内存分析器运行您的应用程序并查看您的 MyType 对象上保存的是什么。

于 2012-12-19T16:32:27.533 回答
0

所以,事实证明我根本没有考虑

目标对象对象包含我要添加行的 StringBuilder。每次迭代大约 10 行,所以显然我可以在内存不足之前在 StringBuilder 中保存大约 1.9 亿行文本;)

于 2012-12-19T23:56:23.153 回答