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-users@gna.org https://mail.gna.org/listinfo/pythonocc-users