[IronPython] Embedded IP eating memory

Dino Viehland dinov at exchange.microsoft.com
Sat Aug 12 00:24:07 CEST 2006


I think calling RunFile is going to leak a module each time -we'll generate a whole new type that isn't garbage collectible and then we won't use it again after your RunFile completes.  I think you'd be better off doing:

object compiledCode = engine.Compile(File.ReadAllText("scripts/CmOpAtiendeCM.py"));

then repeatedly call:

engine.Execute(compiledCode);

On the latest versions this changes to:

CompiledCode cc = engine.Compile(File.ReadAllText("scripts/CmOpAtiendeCM.py"));

Then repeatedly call:

cc.Execute();

Using the API in this way will result in the code being generated once, but executed multiple times.  Currently you're re-compiling the script each time.  So not only should it not leak memory, it should give you better performance as well!

The CLR Profiler is available for download here: http://www.microsoft.com/downloads/details.aspx?FamilyID=a362781c-3870-43be-8926-862b40aa0cd0&DisplayLang=en


From: users-bounces at lists.ironpython.com [mailto:users-bounces at lists.ironpython.com] On Behalf Of Rodolfo Conde
Sent: Friday, August 11, 2006 4:48 PM
To: Discussion of IronPython
Subject: Re: [IronPython] Embedded IP eating memory


    Inside the while cycle, i just do this:

    pyEngine.RunFile("scripts/CMOpAtiendeCM.py");
    thats the little script file. The engine is created only once.

    However, i did inside the cycle a Console.WriteLine("{0} bytes", System.GC.GetTotalMemory(true)) and it gives lower memory usage, there i see that IP seems to be consuming each time the file is run only 2k, no 2m, as the windows taskmanager says

    I do use events, but i do remove the handlers when no longer in use...

    Where can i get a free CLR profiler ?? :)...

    thanks for the help...

    Greetings....


----- Original Message -----
From: Dino Viehland<mailto:dinov at exchange.microsoft.com>
To: Discussion of IronPython<mailto:users at lists.ironpython.com>
Sent: Friday, August 11, 2006 1:48 PM
Subject: Re: [IronPython] Embedded IP eating memory

How are you executing the script file?  If you're creating a new optimized module each time we won't be able to collection the optimized module code.  If on the other hand you're just compiling it as a helper method then when it's done running we can collect the code.

In pre-RC1 we had a leak where creating a new PythonEngine would result in a leak of a SystemState and ClrModule which were being hung onto by an event rooted in the app domain.  So if you're re-creating the engine each time you might be seeing that.  Also, now that I've mentioned events, you might want to check your own C# code if you're using events:  It's easy to forget to unhook one and leak memory because the event handler stays alive forever.

If none of those turn out to be the problem an option here would be to download the free CLR Profiler and look at the object type that is consuming the increased memory.  It'll give you a nice graphical display w/ a block view of what's referencing what.


From: users-bounces at lists.ironpython.com [mailto:users-bounces at lists.ironpython.com] On Behalf Of Rodolfo Conde
Sent: Friday, August 11, 2006 12:58 PM
To: Discussion of IronPython
Subject: [IronPython] Embedded IP eating memory



    Hi....

    I have an IP-Embedded C# application (IP version IronPython 1.0.60523 (Beta) on .NET 2.0.50727.42, Yeah i know, im out of date, but i havent make the change to latest version because i saw there were some API changes :) ), i create one PyEngine, set some global variables and inside a while block i execute this little script every time:

import sys

try:
 i = sys.path.index("scripts")
except:
 sys.path.append("scripts")


import CMOpFuncionalidad


try:
 pyop = CMOpFuncionalidad.PyOperador(cmop, dba, connID)
 pyop.atiendeCM()
 pyop.liberaRecursosBD()
 pyop = None
except:
 pyop.liberaRecursosBD()
 pyop = None
 raise

The module CMOpFuncionaliad is an IPython script i wrote, it contains a class definition. Inside the scripts i use components defined in some assemblies i made (these are already loaded into the CLR). The problem is, after the Engine takes the usual 12M+- of memory it needs, every time the script executes it consumes 2M more, i dont have a clue why is this...Does this version of IP have memory problems ? Or what else could be ?? If you need to see CMOpFuncionalidad.py let me know and ill send it....


    Thanks for your help....

    Greetings...



__________ Información de NOD32, revisión 1.1703 (20060811) __________

Este mensaje ha sido analizado con NOD32 antivirus system
http://www.nod32.com
________________________________
_______________________________________________
users mailing list
users at lists.ironpython.com<mailto:users at lists.ironpython.com>
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com


__________ Información de NOD32, revisión 1.1703 (20060811) __________

Este mensaje ha sido analizado con  NOD32 antivirus system
http://www.nod32.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ironpython-users/attachments/20060811/ff012af9/attachment.html>


More information about the Ironpython-users mailing list