Pregunta

Estoy hospedando IronPython en un servicio web basado en c # para poder proporcionar scripts de extensión personalizados. Sin embargo, me parece que el uso de memoria aumenta considerablemente cuando realizo pruebas de carga simples ejecutando el servicio web repetidamente en un bucle.

IronPython-1.1 implementó IDisposable en sus objetos para que pueda deshacerse de ellos cuando estén listos. El nuevo motor IronPython-2 basado en el DLR no tiene tal concepto.

Por lo que entendí, cada vez que ejecutas un script en el ScriptEngine, un nuevo ensamblaje se inyecta en el dominio de la aplicación y no se puede descargar.

¿Hay alguna manera de evitar esto?

¿Fue útil?

Solución 3

Resulta que, después de que aspnet_wp alcance aproximadamente 500 mb, el recolector de basura se activa y limpia el desorden. El uso de la memoria luego se reduce a aproximadamente 20 mb y comienza a aumentar nuevamente durante la prueba de carga. Así que no hay 'pérdida' de memoria como tal.

Otros consejos

Puedes intentar crear un nuevo dominio de aplicación cada vez que ejecutes uno de tus scripts de IronPython. Aunque no se pueden descargar assebmlies de la memoria, puede descargar un dominio de aplicación y esto le permitirá sacar el ensamblaje inyectado de la memoria.

Debe deshabilitar la generación de código optimizada:

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();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top