Question

J'héberge IronPython dans un WebService basé sur c # pour pouvoir fournir des scripts d'extension personnalisés. Cependant, je constate que l'utilisation de la mémoire augmente fortement lorsque je fais un test de charge simple en exécutant le service Web à plusieurs reprises dans une boucle.

IronPython-1.1 a implémenté IDisposable sur ses objets afin que vous puissiez en disposer à la fin. Le nouveau moteur IronPython-2 basé sur le DLR n’a pas ce concept.

D'après ce que j'ai compris, chaque fois que vous exécutez un script dans ScriptEngine, un nouvel assemblage est injecté dans le domaine d'application et ne peut pas être déchargé.

Y at-il un moyen de contourner cela?

Était-ce utile?

La solution 3

Après aspnet_wp, environ 500 Mo, le ramasse-miettes s’active et nettoie les dégâts. L'utilisation de la mémoire chute alors à environ 20 Mo et recommence progressivement à augmenter pendant les tests de charge. Il n'y a donc pas de «fuite» de mémoire en tant que telle.

Autres conseils

Vous pouvez essayer de créer un nouveau domaine d’application chaque fois que vous exécutez l’un de vos scripts IronPython. Bien que les fichiers assebmlies ne puissent pas être déchargés de la mémoire, vous pouvez décharger un AppDomain, ce qui vous permettra d'extraire la mémoire de l'ensemble injecté.

Vous devez désactiver la génération de code optimisé:

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();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top