Hi Frank,

You're right. Although memory is freed, the _collected_objects list is never
empties because of the cyclic __del__ behaviour. I'm working on a new
algorithm.

Thomas

2010/2/18 Frank Conradie <fr...@qfin.net>

>  Hi Thomas
>
> I think I can guess what is happening - in purge, when you set the
> _collected_objects list to empty, all the objects in the list go out of
> scope and are added back into the list (because their __del__ methods get
> called). Therefore the refcount of these objects will NEVER get down to
> zero.
>
>
> - Frank
>
> On 18/02/2010 2:06 PM, Thomas Paviot wrote:
>
> Hi Franck,
>
>  The __del__ method of all OCC wrapped object is overloaded. Object
> deletion management is delegated to the GarbageCollector class: all deleted
> objects are added to the GarbageCollector.garbage._collected_objects list
> (that's why you actually don't see any decref in your sample):
>
>  Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51)
> [GCC 4.2.1 (Apple Inc. build 5646)] on darwin
> Type "help", "copyright", "credits" or "license" for more information.
> >>> from OCC.Standard import *
> >>> GarbageCollector.garbage._collected_objects
> []
> >>> s = Standard_Transient()
> >>> del s
> >>> GarbageCollector.garbage._collected_objects
> [<OCC.Standard.Standard_Transient; proxy of <Swig Object of type
> 'Standard_Transient *' at 0x1004b9c90> >]
> >>>
>
>  I've been currently working on the GarbageCollector module. I definitely
> have to write a document about the way OCC/python/SWIG handle memory
> management.
>
>  Thomas
>
> 2010/2/18 Frank Conradie <fr...@qfin.net>
>
>> Sorry Thomas, but _kill_pointed does not solve the issue. It looks like
>> the SWIG wrapper objects are not DECREF'd at all - see the example below,
>> which shows that calling "del" on a shape does not decrease the ref count of
>> the SWIG wrapper object at all:
>>
>> import gc
>> import sys
>>
>> import gc
>> from OCC.gp import *
>> from OCC.BRepPrimAPI import *
>> from OCC.TopExp import *
>>  from OCC.TopoDS import *
>>
>>
>> w = 0.1
>> fp1 = (0.,0.,0.)
>> fp2 = (w,w,w)
>> mkbox = BRepPrimAPI_MakeBox(gp_Pnt(fp1[0],fp1[1],fp1[2]),
>> gp_Pnt(fp2[0],fp2[1],fp2[2]))
>>  s = mkbox.Shell()
>>
>>
>> class MemTest(object):
>>     pass
>> mem = MemTest()
>>
>> # The next 3 lines show that _kill_pointed nullifies the underlying shape
>> print 'before: IsNull=', s.IsNull()
>> s._kill_pointed()
>> print 'after: IsNull=', s.IsNull()
>>
>> print gc.get_count()
>> print gc.collect()
>> print gc.get_count()
>> for o in gc.get_objects():
>>     if isinstance(o, TopoDS_Shape) or isinstance(o, MemTest):
>>         print type(o), sys.getrefcount(o)
>>
>> # The next 2 lines should remove s and mem from gc.get_objects, but it
>> only removes mem!!!
>> del s
>> del mem
>>
>> print gc.get_count()
>> print gc.collect()
>> print gc.get_count()
>> for o in gc.get_objects():
>>     if isinstance(o, TopoDS_Shape) or isinstance(o, MemTest):
>>         print type(o), sys.getrefcount(o)
>>
>>
>> I'm not sure where to go from here.
>> - Frank
>>
>>
>>
>> On 17/02/2010 8:29 PM, Thomas Paviot wrote:
>>
>>  2010/2/18 Frank Conradie <fr...@qfin.net>
>>
>>> Hi guys,
>>>
>>
>>  Hi Franck,
>>
>>
>>>
>>> After running into serious memory use issues with our geometric
>>> processing algorithm, I have done a simple experiment that seems to show
>>> that wrapper garbage collection does not work at all. Try the code
>>> below, and you should run out of memory in no time:
>>>
>>>
>>> import gc
>>> from OCC.gp import *
>>> from OCC.BRepPrimAPI import *
>>> from OCC.TopExp import *
>>>
>>> def TestMemory():
>>>     w = 0.1
>>>     fp1 = (0.,0.,0.)
>>>     fp2 = (w,w,w)
>>>     mkbox = BRepPrimAPI_MakeBox(gp_Pnt(fp1[0],fp1[1],fp1[2]),
>>> gp_Pnt(fp2[0],fp2[1],fp2[2]))
>>>     s1 = mkbox.Shell()
>>>     e = TopExp_Explorer()
>>>     for i in range(1000000):
>>>         print i
>>>         e.Init(s1, TopAbs_FACE)
>>>         while e.More():
>>>             sh = e.Current()
>>>             e.Next()
>>>         if not (i % 1000):
>>>             print 'Collecting garbage...'
>>>             gc.collect()
>>>     while 1:
>>>         pass
>>>
>>>
>>> Not sure if this is a known issue or not,
>>
>>
>>  It's known to be an issue, see:
>> * http://www.opencascade.org/org/forum/thread_17702/
>> * the changelog of the 0.4 release
>>
>>
>>> but it certainly makes the
>>> wrapper problematic for our current purposes. If you can point me at the
>>> right place in the wrapper generator I can maybe try and help.
>>>
>>
>>  The standard python gc module can not be used with pythonOCC: it's
>> perfectly suitable to manage python objects deletion, but fails to properly
>> handle the C++ pointed objects. A GarbageCollector class is available from
>> any pythonOCC module you're using. For instance:
>>
>>  Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51)
>> [GCC 4.2.1 (Apple Inc. build 5646)] on darwin
>> Type "help", "copyright", "credits" or "license" for more information.
>> >>> from OCC.Standard import *
>> >>> GarbageCollector
>> <module 'OCC.GarbageCollector' from
>> '/Library/Python/2.6/site-packages/OCC/GarbageCollector.pyc'>
>> >>> dir(GarbageCollector)
>> ['GarbageCollector', '__builtins__', '__doc__', '__file__', '__name__',
>> '__package__', 'garbage', 'sys']
>>  >>> GarbageCollector.garbage
>> <OCC.GarbageCollector.GarbageCollector object at 0x100593e10>
>> >>> dir(GarbageCollector.garbage)
>> ['__class__', '__delattr__', '__dict__', '__doc__', '__format__',
>> '__getattribute__', '__hash__', '__init__', '__module__', '__new__',
>> '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
>> '__str__', '__subclasshook__', '__weakref__', '_collected_objects',
>> 'collect_object', 'get_collected', 'purge']
>>
>>  The source code of this module is here:
>>
>> http://svn.gna.org/viewcvs/pythonocc/trunk/src/wrapper/GarbageCollector.py?rev=706&view=markup
>>
>>  In a few words, if you want to completely free memory:
>> GarbageCollector.garbage.purge()
>>
>>  If you want to free one specific object, use the _kill_pointed() method
>> of that object (Nulify, Clear, Destroy won't work).
>>
>>  I'll take time to write a more detailed message tomorrow about that
>> topic.
>>
>>
>>> Thanks,
>>> Frank Conradie
>>> Qfinsoft
>>>
>>
>>  All the best,
>>
>>  Thomas
>>
>>
>> _______________________________________________
>> Pythonocc-users mailing list
>> pythonocc-us...@gna.orghttps://mail.gna.org/listinfo/pythonocc-users
>>
>>
>> _______________________________________________
>> Pythonocc-users mailing list
>> Pythonocc-users@gna.org
>> https://mail.gna.org/listinfo/pythonocc-users
>>
>>
>
> _______________________________________________
> Pythonocc-users mailing 
> listpythonocc-us...@gna.orghttps://mail.gna.org/listinfo/pythonocc-users
>
>
> _______________________________________________
> Pythonocc-users mailing list
> Pythonocc-users@gna.org
> https://mail.gna.org/listinfo/pythonocc-users
>
>
_______________________________________________
Pythonocc-users mailing list
Pythonocc-users@gna.org
https://mail.gna.org/listinfo/pythonocc-users

Reply via email to