我正在使用IronPython 2.6.2 for .NET 4.0作为C#/ WPF应用程序中的脚本平台。脚本可以包括它们自己的函数定义,类定义等。我不限制可以写的内容。
脚本更改后,脚本文件中出现了内存泄漏。在评论出越来越多的代码之后,我们确定定义和调用超过13个参数的函数会导致内存泄漏。因此,如果你调用一个带有14个参数的函数,IronPython就会泄漏。
以下是每100毫秒运行一次的计时器示例代码:
_Timer.Enabled = false;
try
{
var engine = Python.CreateEngine();
engine.Execute("def SomeFunc(paramI, paramII, paramIII, paramIV, paramV, paramVI, paramVII, paramVIII, paramIX, paramX, paramXI, paramXII, paramXIII, paramXIV):\r\n\tpass\r\nSomeFunc(1,2,3,4,5,6,7,8,9,10,11,12,13,14)");
//engine.Execute("def SomeFunc(paramI, paramII, paramIII, paramIV, paramV, paramVI, paramVII, paramVIII, paramIX, paramX, paramXI, paramXII, paramXIII):\r\n\tpass\r\nSomeFunc(1,2,3,4,5,6,7,8,9,10,11,12,13)");
// With and without the following line makes no difference
engine.Runtime.Shutdown();
this.Dispatcher.Invoke((Action)delegate()
{
this.Title = DateTime.Now.ToString();
});
}
catch (Exception)
{
}
_Timer.Enabled = true;
请注意,我有一个14参数版本的脚本,下面是一个注释掉的13参数版本。 Python脚本基本上是这样的:
def SomeFunc(paramI, paramII, paramIII, paramIV, paramV, paramVI, paramVII, paramVIII, paramIX, paramX, paramXI, paramXII, paramXIII, paramXIV):
pass
SomeFunc(1,2,3,4,5,6,7,8,9,10,11,12,13,14)
我尝试过使用和不使用engine.Runtime.Shutdown()但它没有任何区别。 14参数版本的内存将快速攀升,13参数版本的内存将略微攀升然后稳定下来。
有什么想法吗?
由于 - 肖恩
答案 0 :(得分:1)
IronPython中有一些神奇的参数 - 少于一个不同(更快)的代码路径而不是更多。听起来后备代码中仍然存在一些错误。你能用一个独立的测试用例来open an issue吗?
查看最新的代码,我认为边界将是15.您可以再试一次2.7 Beta 2并查看结果是否相同?