Necesito un poco de ayuda para encontrar una solución a una pérdida de memoria que estoy teniendo. Tengo una aplicación C# (.NET v3.5) que permite a un usuario ejecutar scripts de IronPython para fines de prueba. Los scripts pueden cargar diferentes módulos de la biblioteca estándar de Python (como se incluye con los binarios de IronPython). Sin embargo, cuando se completa el script, la memoria asignada a los módulos importados no es basura. El bucle a través de varias ejecuciones de un script (hecho para pruebas de estrés) hace que el sistema se quede sin memoria durante el uso a largo plazo.Embedded IronPython pérdida de memoria
Aquí es una versión simplificada de lo que estoy haciendo.
clase de secuencias de comandos principal función:
public void Run()
{
// set up iron python runtime engine
this.engine = Python.CreateEngine(pyOpts);
this.runtime = this.engine.Runtime;
this.scope = this.engine.CreateScope();
// compile from file
PythonCompilerOptions pco = (PythonCompilerOptions)this.engine.GetCompilerOptions();
pco.Module &= ~ModuleOptions.Optimized;
this.script = this.engine.CreateScriptSourceFromFile(this.path).Compile(pco);
// run script
this.script.Execute(this.scope);
// shutdown runtime (run atexit functions that exist)
this.runtime.Shutdown();
}
Un ejemplo de script 'test.py' que carga el módulo random (añade ~ 1.500 KB de memoria):
import random
print "Random number: %i" % random.randint(1,10)
Un mecanismo de bucle que se hacer que el sistema se quede sin memoria:
while(1)
{
Script s = new Script("test.py");
s.Run();
s.Dispose();
}
he añadido la sección de no optimizar la compilación basado en lo que encontré en el hilo this, pero la pérdida de memoria ocurre de cualquier manera. Agregar la llamada explícita a s.Dispose() tampoco hace ninguna diferencia (como se esperaba). Actualmente estoy usando IronPython 2.0, pero también intenté actualizar a IronPython 2.6 RC2 sin ningún éxito.
¿Cómo consigo los módulos importados en el guión IronPython incrustado sea recolectado como objetos .NET normales cuando el motor de secuencias de comandos/runtime se sale del ámbito?
Sí, esto funciona bien con IronPython 2.6 RC2. Pero no funcionó con IronPython 2.0.1. Desafortunadamente, 2.6 RC2 tiene problemas para importar variables al espacio de nombres global. Voy a probar 2.0.3 y publicar resultados. Gracias por la ayuda hasta ahora :) – cgyDeveloper
2.0.3 tampoco es bueno. – cgyDeveloper