Утечка памяти в IronPython при вызове функции с более чем 13 параметрами - PullRequest
2 голосов
/ 09 февраля 2011

Я использую IronPython 2.6.2 для .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 параметрами немного увеличится и стабилизируется.

Есть мысли?

Спасибо - Шон

1 Ответ

1 голос
/ 09 февраля 2011

В IronPython есть огромное количество параметров - меньше, чем другой (более быстрый) путь кода, чем больше.Похоже, в резервном коде все еще есть ошибки.Не могли бы вы открыть вопрос с помощью отдельного контрольного примера?

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

...