Domanda

Sto ospitando IronPython in un WebService basato su c # per poter fornire script di estensione personalizzati. Tuttavia, sto scoprendo che l'utilizzo della memoria aumenta notevolmente quando eseguo semplici test di carico eseguendo il servizio Web ripetutamente in un ciclo.

IronPython-1.1 ha implementato IDisposable sui suoi oggetti in modo da poterli smaltire al termine. Il nuovo motore IronPython-2 basato sul DLR non ha questo concetto.

Da quanto ho capito, ogni volta che si esegue uno script in ScriptEngine, un nuovo assembly viene iniettato nell'appdomain e non può essere scaricato.

C'è un modo per aggirare questo?

È stato utile?

Soluzione 3

Si scopre, dopo che aspnet_wp è arrivato a circa 500mb, il garbage collector entra in azione e ripulisce il casino. L'utilizzo della memoria scende quindi a circa 20 MB e riprende costantemente ad aumentare durante il test di carico. Quindi non c'è "perdita" di memoria in quanto tale.

Altri suggerimenti

Puoi provare a creare un nuovo AppDomain ogni volta che esegui uno dei tuoi script IronPython. Sebbene gli assebmlies non possano essere scaricati dalla memoria, è possibile scaricare un AppDomain e ciò consentirà di eliminare dalla memoria l'assembly iniettato.

Devi disabilitare la generazione di codice ottimizzata:

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();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top