2009-03-04 11 views
2

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 brusquement lorsque je fais un test de charge simple en exécutant le service web de manière répétée en boucle. IronPython-1.1 implémenté IDisposable sur ses objets afin que vous puissiez les éliminer quand ils sont terminés. 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 le ScriptEngine, un nouvel assemblage est injecté dans l'appdomain et ne peut pas être déchargé.Utilisation de la mémoire IronPython

Y a-t-il un moyen de contourner ce problème?

Répondre

0

fin de compte, après aspnet_wp va à environ 500 Mo, le garbage collector entre en jeu et nettoie le gâchis. L'utilisation de la mémoire chute ensuite à environ 20 Mo et recommence à augmenter à nouveau pendant le test de charge. Il n'y a donc pas de «fuite» de mémoire en tant que telle.

+0

Vous vous intéressez au problème que j'ai soumis à l'équipe IP l'année dernière. http://www.mail-archive.com/[email protected]/msg05771.html – Sake

1

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 assebmlies ne puisse pas être déchargé de la mémoire, vous pouvez décharger un AppDomain et cela vous permettra d'obtenir l'assemblage injecté en mémoire.

1

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(); 
} 
Questions connexes