Использование памяти IronPython - PullRequest
2 голосов
/ 04 марта 2009

Я размещаю IronPython в WebService на основе c #, чтобы иметь возможность предоставлять собственные сценарии расширения. Однако я обнаружил, что использование памяти резко возрастает, когда я выполняю простое нагрузочное тестирование, многократно выполняя веб-сервис в цикле.

IronPython-1.1 реализовал IDisposable на своих объектах, так что вы можете избавиться от них, когда они будут сделаны. Новый движок IronPython-2, основанный на DLR, не имеет такой концепции.

Из того, что я понял, каждый раз, когда вы выполняете скрипт в ScriptEngine, новая сборка внедряется в домен приложения и не может быть выгружена.

Есть ли способ обойти это?

Ответы [ 3 ]

1 голос
/ 05 марта 2009

Вам необходимо отключить генерацию оптимизированного кода:

var runtime = Python.CreateRuntime();
var engine = runtime.GetEngine("py");
PythonCompilerOptions pco = (PythonCompilerOptions)engine.GetCompilerOptions();
pco.Module &= ~ModuleOptions.Optimized;

// this shouldn't leak now
while(true) {
   var code = engine.CreateScriptSourceFromString("1.0+2.0").Compile(pco);
   code.Execute();
}
1 голос
/ 04 марта 2009

Вы можете попробовать создать новый домен приложений каждый раз, когда запускаете один из ваших сценариев IronPython. Хотя сборки не могут быть выгружены из памяти, вы можете выгрузить домен приложений, и это позволит вам извлечь внедренную сборку из памяти.

0 голосов
/ 05 марта 2009

Оказывается, после того, как aspnet_wp достигает примерно 500 Мб, сборщик мусора включается и убирает беспорядок. Затем объем используемой памяти падает примерно до 20 МБ и снова начинает увеличиваться во время нагрузочного тестирования. Таким образом, нет утечки памяти как таковой.

...