2011-02-09 4 views
2

Я использую IronPython 2.6.2 для .NET 4.0 как платформу сценариев в приложении C#/WPF. Скрипты могут включать в себя их собственные определения функций, определения классов и т. Д. Я не ограничиваю, что можно записать.Утечка памяти IronPython при вызове с более чем 13 параметрами

Ускорение памяти появилось в скриптовой части недавно после смены сценария. После комментирования все большего количества кода мы определили, что определение и вызов функции с более чем 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 параметрами будет слегка расти, а затем стабилизироваться.

Любые мысли?

Благодаря - Shaun

ответ

1

Там это магическое число параметров в IronPython - меньше, чем это отличается (быстрее) путь кода, чем больше. Похоже, в резервном коде все еще есть некоторые ошибки. Можете ли вы получить open an issue с автономным тестовым чеком?

Глядя на последний код, я думаю, что граница будет в 15. Можете ли вы попробовать еще раз на 2.7 Beta 2 и посмотреть, совпадают ли результаты?

+0

Спасибо, Джефф. Я пробовал 2.7 Beta 2 и имел те же результаты. Запуск приложения с 14-параметрической версией «голого металла» быстро просочился в память, но версия с 13 параметрами потребляла некоторую память, а затем стабилизировалась. – Shaun

+0

Для всех, кого это интересует, я отправил ошибку в проект IronPython на CodePlex в комплекте с образцом кода, который демонстрирует проблему. http://ironpython.codeplex.com/workitem/30131 – Shaun

Смежные вопросы