Thank you for that information !
This would finally be a reason to upgrade I guess :).

Cheers,
Sebastian

On Mon, Apr 13, 2009 at 5:05 AM, Ian Jones <[email protected]> wrote:

>
> Yes this has been reported before and a known issue to Autodesk and
> claimed-fixed in 2009 and to my testing thus far it has been.
>
> On Sat, Apr 11, 2009 at 8:43 AM, Byron <[email protected]> wrote:
> >
> > ... and I truly hope that whatever I found out is just my mistake,
> > already solved and not as terrible as it appears, so here it comes:
> > Whenever you make a call to maya.cmds.<commandname>, an arglist and a
> > your list of kwargs will be stored as tuples and held. These tuples
> > will never be collected or deleted, and thus consume memory.
> > This starts becoming an issue if you call a command a few 10 thousands
> > of times.
> >
> > I could verify this issue on Maya8.5 64 linux and Maya2008 OSX.
> >
> > I assume that someone in the c-part of the cmds wrap does not
> > decrement the refcount on the tuples created, thus python keeps
> > thinking they are in use. The refcount of these tuples 3(-1) in Maya
> > 8.5 and 4(-1) in Maya2008.
> >
> > Is this a known bug ? If not it would be great if anyone with a nice
> > support contract could bring it up :).
> >
> > Cheers,
> > Sebastian ( being so incredibly disappointed right now )
> >
> > The Code :
> > Makes 10 runs and calls simple mel commands 1000 times, checking the
> > garbage collectors object count after each run.
> > The collection cannot get ahold of these objects being continuously
> > added to the collector.
> > As these commands are read-only, the undo-queue cannot be involved.
> > If you rewrite the loop so that it uses the pymel API wrap for
> > instance, the gc's object count will not raise.
> > If you want to crank up the numbers, you will see that this really
> > consumes memory once the object count hits a million and if you issue
> > a little more complex commands.
> >
> > <pre>
> > import sys
> > import gc
> > assert gc.isenabled()
> > import maya.cmds as cmds
> >
> > for run in range( 10 ):
> >        print "%i: Pre-cmds execution: %i" % ( run, len( gc.get_objects()
> ) )
> >        for i in range( 1000 ):
> >                cmds.listRelatives( "persp", shapes = 1, ni = 1 )
> >                cmds.ls( sl=1 )
> >        print "Post-cmds execution: %i" % len( gc.get_objects() )
> >
> > # the garbage collection cannot get ahold of these objects
> > assert gc.collect() == 0
> >
> > # lets check the refcount on these tuples
> > lobj = gc.get_objects()[-1]
> > print "%s.refcount = %i" % ( lobj, sys.getrefcount( lobj ) )
> >
> > # just to be sure: yes, its our arguments we passed to the cmds
> > for obj in gc.get_objects()[-50:]: print obj
> > </pre>
> > >
> >
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/python_inside_maya
-~----------~----~----~----~------~----~------~--~---

Reply via email to