J'ai besoin d'aide pour trouver une solution à une fuite de mémoire que j'ai. J'ai une application C# (.NET v3.5) qui permet à un utilisateur d'exécuter des scripts IronPython à des fins de test. Les scripts peuvent charger différents modules à partir de la bibliothèque standard Python (comme inclus avec les binaires IronPython). Cependant, lorsque le script est terminé, la mémoire allouée aux modules importés n'est pas récupérée. Le bouclage à travers plusieurs exécutions d'un script (effectué pour un test de stress) entraîne l'épuisement du système en cas d'utilisation à long terme.Fuite de mémoire IronPython intégrée
Voici une version simplifiée de ce que je fais.
fonction de classe Script principale:
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 exemple 'test.py' script qui charge le module aléatoire (ajoute ~ 1500 Ko de mémoire):
import random
print "Random number: %i" % random.randint(1,10)
Un mécanisme en boucle qui sera provoque l'épuisement de la mémoire du système:
while(1)
{
Script s = new Script("test.py");
s.Run();
s.Dispose();
}
J'ai ajouté la section pour optimiser la compilation basé sur ce que j'ai trouvé dans this thread, mais la fuite de mémoire se produit de toute façon. L'ajout de l'appel explicite à s.Dispose() ne fait également aucune différence (comme prévu). J'utilise actuellement IronPython 2.0, mais j'ai également essayé de mettre à niveau vers IronPython 2.6 RC2 sans aucun succès. Comment faire en sorte que les modules importés dans le script IronPython incorporé soient récupérés comme des objets .NET normaux lorsque le moteur de script/l'environnement d'exécution sortent de la portée?
Oui, cela fonctionne très bien avec IronPython 2.6 RC2. Mais cela n'a pas fonctionné avec IronPython 2.0.1. Malheureusement, 2.6 RC2 rencontre des problèmes pour importer des variables dans l'espace de noms global. Je vais essayer 2.0.3 et afficher les résultats. Merci pour l'aide jusqu'à présent :) – cgyDeveloper
2.0.3 n'est pas bon non plus. – cgyDeveloper