Ho bisogno di aiuto per trovare una soluzione a una perdita di memoria che sto avendo. Ho un'applicazione C# (.NET v3.5) che consente a un utente di eseguire script IronPython a scopo di test. Gli script possono caricare diversi moduli dalla libreria standard Python (come incluso con i binari di IronPython). Tuttavia, al termine dello script, la memoria allocata ai moduli importati non viene raccolta. Il ciclo di più esecuzioni di uno script (eseguito per test di stress) causa l'esaurimento della memoria del sistema durante l'utilizzo a lungo termine.Perdita di memoria IronPython incorporata
Ecco una versione semplificata di ciò che sto facendo.
classe Script funzione 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 'test.py' script di esempio che carica il modulo random (aggiunge ~ 1500 KB di memoria):
import random
print "Random number: %i" % random.randint(1,10)
Un meccanismo di loop che verrà causa di esaurimento della memoria del sistema:
while(1)
{
Script s = new Script("test.py");
s.Run();
s.Dispose();
}
Ho aggiunto la sezione per non ottimizzare la compilazione in base a ciò che ho trovato nel thread this, ma la perdita di memoria si verifica in entrambi i casi. Anche l'aggiunta della chiamata esplicita a s.Dispose() non fa differenza (come previsto). Attualmente sto usando IronPython 2.0, ma ho anche provato ad aggiornare IronPython 2.6 RC2 senza alcun successo.
Come si ottengono i moduli importati nello script IronPython incorporato da raccogliere come normali oggetti .NET quando il motore di scripting/runtime esce dall'ambito?
Sì, funziona perfettamente con IronPython 2.6 RC2. Ma non ha funzionato con IronPython 2.0.1. Sfortunatamente, 2.6 RC2 sta incontrando problemi nell'importazione di variabili nello spazio dei nomi globale. Ho intenzione di provare 2.0.3 e postare risultati. Grazie per l'aiuto finora :) – cgyDeveloper
2.0.3 non va bene, neanche. – cgyDeveloper