Thanks Istvan for this interesting report. I checked the GarbageCollector implementation, added a VERBOSE mode and here is the result: $ python example_GC_istvan_v2.py running number 0 creating 2500 points creating poly discretizing exit function and collect garbage Before smart_purge The Gabrbage contains:
100 handles 100 transients 705 misc After smart_purge The Gabrbage contains: 0 handles 100 transients 0 misc running number 1 creating 2500 points creating poly discretizing exit function and collect garbage Before smart_purge The Gabrbage contains: 100 handles 200 transients 705 misc After smart_purge The Gabrbage contains: 0 handles 200 transients 0 misc running number 2 creating 2500 points creating poly discretizing exit function and collect garbage Before smart_purge The Gabrbage contains: 100 handles 300 transients 705 misc After smart_purge The Gabrbage contains: 0 handles 300 transients 0 misc running number 3 creating 2500 points creating poly discretizing exit function and collect garbage Before smart_purge The Gabrbage contains: 100 handles 400 transients 705 misc After smart_purge The Gabrbage contains: 0 handles 400 transients 0 misc There actually is a leak, some transient are not deleted (some issues with ref counting). Could you please edit site-packages/OCC/GarbageCollector.py and add this method to the GarbageCollector class? def purge(self): while len(self._handles)>0: handle = self._handles.pop() handle.Nullify() handle.was_purged = True while len(self._transients)>0: transient = self._transients.pop() transient._kill_pointed() transient.was_purged = True while len(self._misc)>0: misc = self._misc.pop() misc._kill_pointed() misc.was_purged = True And test your code with purge() rather than smart_purge(). I tested that all objects are deleted and the memory footprint does not increase. Thomas 2011/9/29 István Csanády <istvancsan...@gmail.com> > I attached the code. Experiences: > 1. The C++ code is about 30 times faster. (the python profiler says the > most costly function is _loop_topo in Topology.py, I will check it out > maybe I can make it faster) > 2. The memory footprint does not grow even if I creating random sized > grids. > 3. It does not crash. > I tried to emulate the behaviour of the pythonocc garbage collector with an > stl::list - I don't know if it makes any sense. > > > On Thu, Sep 29, 2011 at 8:56 PM, István Csanády > <istvancsan...@gmail.com>wrote: > >> OK forget the code I previously sent, I have installed ftgl, and now >> testing it, and the one I sent is not working (what is not very stunning >> since I could not run it :) ) >> >> On Thu, Sep 29, 2011 at 8:09 PM, István Csanády >> <istvancsan...@gmail.com>wrote: >> >>> I have installed the OCE-0.6.0 with the .mpkg. I can compile OCC >>> executables, but crashes because it can't find libftgl.dylib... Now I am >>> going to recompile it from sources without the GL stuff but it takes a while >>> on my macbook :(. I have attached the code, but I don't know if it works, >>> and I have not implemented something like pythonocc's garbage collection yet >>> (it is maybe not even neccessary). >>> >>> Error message: >>> >>> *dyld: Library not loaded: /usr/local/lib/libftgl.2.dylib* >>> >>> * Referenced from: >>> /Users/istvancsanady/Library/Developer/Xcode/DerivedData/oce_memtest-augtghxmaekbeydwmiliecjltrpc/Build/Products/Debug/libTKOpenGl.1.dylib >>> * >>> >>> * Reason: image not found* >>> >>> * >>> * >>> >>> * >>> * >>> >>> On Thu, Sep 29, 2011 at 5:16 PM, Thomas Paviot <tpav...@gmail.com>wrote: >>> >>>> Can you please attach the code? >>>> >>>> >>>> Thomas >>>> >>>> 2011/9/29 István Csanády <istvancsan...@gmail.com> >>>> >>>>> I am currently working on it, but I getting compile errors for private >>>>> copy constructors in the GCPnts_UniformDeflection and BRepLib_MakeShape >>>>> headers, for eg. "Field of type 'TColStd_SequenceOfReal' has private copy >>>>> constructor"... I don't really understand why do I get these since until >>>>> now >>>>> I have never met such compile errors in OCC. What am I doing wrong? >>>>> >>>>> >>>>> On Thu, Sep 29, 2011 at 3:43 PM, Thomas Paviot <tpav...@gmail.com>wrote: >>>>> >>>>>> Istvan, >>>>>> >>>>>> I'm a bit confused with your example. It appears that the MMGT_OPT env >>>>>> var has an impact on the crash produced by your program. If I set >>>>>> MMGT_OPT >>>>>> to 1, I don't have any crash, crashes with MMGT_OPT=0 and MMGT_OPT=2 >>>>>> (Intel >>>>>> TBB). Really difficult to say whether it comes from occ or pythonocc. >>>>>> >>>>>> If you achieve a C++ version of your program (the random part is not >>>>>> necessary), I will add it to the OCE test suite. >>>>>> >>>>>> Thomas >>>>>> >>>>>> >>>>>> 2011/9/29 Thomas Paviot <tpav...@gmail.com> >>>>>> >>>>>>> It will. >>>>>>> >>>>>>> >>>>>>> 2011/9/29 István Csanády <istvancsan...@gmail.com> >>>>>>> >>>>>>>> OK, I going to port it today, and check the memory consumption. (I >>>>>>>> am using opencascade 6.5, but it will work with OCE, won't it?) >>>>>>>> >>>>>>>> >>>>>>>> On Thu, Sep 29, 2011 at 11:29 AM, Thomas Paviot >>>>>>>> <tpav...@gmail.com>wrote: >>>>>>>> >>>>>>>>> There are two different issues IMO: >>>>>>>>> - the segfault. I think I have identified the origin of the >>>>>>>>> problem, it comes from the GarbageCollector implementation >>>>>>>>> - the leak. I also noticed this increase in memory consumption, >>>>>>>>> however it's no more the case if the size of the vert list is >>>>>>>>> constant. If >>>>>>>>> you replace, for instance, the random loop with: >>>>>>>>> for x in range(50): >>>>>>>>> for y in range(50): >>>>>>>>> [...] >>>>>>>>> Then memory consumption does not increase anymore (can you check >>>>>>>>> that point?). That means that the pythonocc garbage collector does >>>>>>>>> the job >>>>>>>>> as expected and I suspect rather OCC memory manager to be the cause >>>>>>>>> of this >>>>>>>>> behavior. To be sure about that, this example should first be ported >>>>>>>>> to C++ >>>>>>>>> and included into the OCE testing suite. >>>>>>>>> >>>>>>>>> Thomas >>>>>>>>> >>>>>>>>> 2011/9/29 István Csanády <istvancsan...@gmail.com> >>>>>>>>> >>>>>>>>>> The program you sent is still leaking even if I comment out >>>>>>>>>> gcurve.GetObject() but it seems to be better then it was. If I leave >>>>>>>>>> the >>>>>>>>>> gcurve.GetObject() line it also crashes. >>>>>>>>>> Here is a memory consumption log: >>>>>>>>>> >>>>>>>>>> 76.015625, 76.015625, 76.19921875, 76.19921875, 76.19921875, >>>>>>>>>> 83.55859375, 82.9140625, 82.9140625, 82.9140625, 84.13671875, >>>>>>>>>> 85.296875, 84.99609375, 84.99609375, 84.99609375, 83.24609375, >>>>>>>>>> 84.234375, 83.24609375, 84.140625, 89.64453125, 89.4140625, >>>>>>>>>> 87.4140625, 87.4140625, 87.1640625, 87.1640625, 88.3125, 88.1640625, >>>>>>>>>> 88.1640625, 88.73046875, 88.1640625, 88.1640625, 87.21484375, >>>>>>>>>> 86.1640625, >>>>>>>>>> 86.1640625, 86.1640625, 89.1328125, 89.10546875, 88.16796875, >>>>>>>>>> 92.15234375, >>>>>>>>>> 91.16796875, 90.16796875, 90.16796875, 90.16796875, 95.42578125, >>>>>>>>>> 95.07421875, 94.71875, 93.76953125, 93.32421875, 92.07421875, >>>>>>>>>> 92.921875, 92.10546875, 91.49609375, 91.07421875, 91.07421875, >>>>>>>>>> 91.07421875, 91.07421875, 94.8515625, 94.07421875, 94.07421875, >>>>>>>>>> 93.82421875, 93.82421875, 93.82421875, 93.82421875, 92.82421875, >>>>>>>>>> 92.82421875, 93.38671875, 93.1328125, 93.1328125, 93.1328125, >>>>>>>>>> 93.1328125, 94.26171875, 92.625, 92.625, 93.69921875, 94.5078125, >>>>>>>>>> 93.578125, 92.578125, 92.578125, 92.078125, 91.078125, 91.078125, >>>>>>>>>> 93.2109375, 93.078125, 92.078125, 92.078125, 94.12109375, >>>>>>>>>> 93.4921875, 93.078125, 95.7890625, 93.078125, 93.45703125, 93.078125, >>>>>>>>>> 93.078125, 94.41796875, 93.578125, 94.27734375, 93.578125, 93.578125, >>>>>>>>>> 93.578125, 93.59375, 93.66796875, 93.328125, 93.41796875, >>>>>>>>>> 93.98828125, 96.0625, 95.5703125, 95.328125, 95.44140625, >>>>>>>>>> 95.328125, 95.328125, 95.078125, 95.078125, 93.92578125, >>>>>>>>>> 93.078125, 93.1796875, 93.078125, 92.078125, 92.078125, 93.4921875, >>>>>>>>>> 93.4921875, 93.078125, 93.078125, 93.078125, 93.4296875, 93.078125, >>>>>>>>>> 94.2109375, 93.48828125, 94.1640625, 93.578125, 93.26953125, >>>>>>>>>> 92.578125, >>>>>>>>>> 91.578125, 90.828125, 90.828125, 90.828125, 90.828125, >>>>>>>>>> 97.32421875, 96.7421875, 97.63671875, 96.7421875, 96.7421875, >>>>>>>>>> 96.7421875, 96.7421875, 96.7421875, 96.7421875, 96.7421875, >>>>>>>>>> 96.7421875, >>>>>>>>>> 95.7421875, 95.7421875, 95.7421875, 95.7421875, 98.7890625, >>>>>>>>>> 97.33203125, 97.59375, 97.33203125, 97.08203125, 99.3828125, >>>>>>>>>> 97.33203125, 96.4453125, 96.08203125, 95.08203125, 95.08203125, >>>>>>>>>> 95.08203125, 95.08203125, 96.890625, 96.08203125, 96.08203125, >>>>>>>>>> 97.80078125, >>>>>>>>>> 97.08203125, 98.56640625, 97.46875, 97.46875, 97.46875, 96.46875, >>>>>>>>>> 96.08203125, 100.66015625, 100.33203125 >>>>>>>>>> >>>>>>>>>> On Thu, Sep 29, 2011 at 7:00 AM, Thomas Paviot <tpav...@gmail.com >>>>>>>>>> > wrote: >>>>>>>>>> >>>>>>>>>>> The issue comes from the line curve_object = gcurve.GetObject(). >>>>>>>>>>> Comment out this line to check that memory consumption is constant >>>>>>>>>>> over >>>>>>>>>>> time. >>>>>>>>>>> >>>>>>>>>>> Attached another implementation of your program, can you please >>>>>>>>>>> test it and report. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> Thomas >>>>>>>>>>> >>>>>>>>>>> 2011/9/28 István Csanády <istvancsan...@gmail.com> >>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> The corrected code does not crash, but it leaks like sieve >>>>>>>>>>>> (0-3MB/s for me)... And if you try to call smart_purge() after >>>>>>>>>>>> pop_context() >>>>>>>>>>>> it segfaults. >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> On Wed, Sep 28, 2011 at 10:22 PM, Thomas Paviot < >>>>>>>>>>>> tpav...@gmail.com> wrote: >>>>>>>>>>>> >>>>>>>>>>>>> 2011/9/28 István Csanády <istvancsan...@gmail.com> >>>>>>>>>>>>> >>>>>>>>>>>>>> Hi Thomas, >>>>>>>>>>>>>> >>>>>>>>>>>>>> On Wed, Sep 28, 2011 at 9:19 PM, Thomas Paviot < >>>>>>>>>>>>>> tpav...@gmail.com> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> Hi Istvan, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Not yet. Trying to run your example actually helped me to >>>>>>>>>>>>>>> figure out/fix a serious regression in the current pythonocc >>>>>>>>>>>>>>> master branch. >>>>>>>>>>>>>>> There is still another bug to fix. I'm currently running >>>>>>>>>>>>>>> pythonocc master ( >>>>>>>>>>>>>>> https://github.com/tpaviot/pythonocc)/OCE-0.6.0-rc3. >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>>> Do you run pythonocc-0.5/OCC630? >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> Yes. >>>>>>>>>>>>>> >>>>>>>>>>>>>> So you say that my code does not crash for you? If I remember >>>>>>>>>>>>>> correctly you are a Mac user to, aren't you? Are you using >>>>>>>>>>>>>> 10.6.7 too with >>>>>>>>>>>>>> Python 2.6.1 ? May I try to recompile pythonocc with OCE? Can it >>>>>>>>>>>>>> fix this >>>>>>>>>>>>>> error? This bug is incredibly hard to track down since the >>>>>>>>>>>>>> python debugger >>>>>>>>>>>>>> does not stop when the C++ code crashes... Do you use any >>>>>>>>>>>>>> special tools to >>>>>>>>>>>>>> debug such errors when developing pythonocc? >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> I didn't say it crashes, I was running the test. >>>>>>>>>>>>> >>>>>>>>>>>>> It's done now, I can reproduce the crash, the program segfaults >>>>>>>>>>>>> after a few loops are performed (I run OSX 10.6.8). I can't >>>>>>>>>>>>> explain so far >>>>>>>>>>>>> what happens, I need to dive into the example (make it even >>>>>>>>>>>>> simpler) and >>>>>>>>>>>>> check what's going on. >>>>>>>>>>>>> >>>>>>>>>>>>> I also suggest you use garbage.push_context() and >>>>>>>>>>>>> pop_context(): only objects created between push/pop will be >>>>>>>>>>>>> killed by the >>>>>>>>>>>>> smart_purge method. The corrected program attached works properly. >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> István >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> Thomas >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> All the best, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Thomas >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 2011/9/28 István Csanády <istvancsan...@gmail.com> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Hi Thomas, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Have you managed to reproduce the error? I've been trying to >>>>>>>>>>>>>>>> track down the bug with valgrind - without any success... >>>>>>>>>>>>>>>> Probably I should >>>>>>>>>>>>>>>> recompile python with the debug and --without-pymalloc flags >>>>>>>>>>>>>>>> to make >>>>>>>>>>>>>>>> valgrind work with it. I am using Mac OS X 10.6.7. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> István >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On Wed, Sep 28, 2011 at 11:21 AM, Thomas Paviot < >>>>>>>>>>>>>>>> tpav...@gmail.com> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> 2011/9/27 István Csanády <istvancsan...@gmail.com> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Hi, >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Hi Istvan, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Last time when I wrote about this bug I thought it was >>>>>>>>>>>>>>>>>> caused by some numpy buffer overflow. Unfortunately it was >>>>>>>>>>>>>>>>>> not. Finally I >>>>>>>>>>>>>>>>>> managed to create some code that can reproduce this bug. I >>>>>>>>>>>>>>>>>> have attached the >>>>>>>>>>>>>>>>>> code and some crash logs. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I've been trying to reproduce the issue. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> I think the problem is probably with OCC's >>>>>>>>>>>>>>>>>> Standard_MMgrOpt class memory recycling for small blocks (Is >>>>>>>>>>>>>>>>>> it possible >>>>>>>>>>>>>>>>>> that smart_purge frees memory that Standard_MMgrOpt want to >>>>>>>>>>>>>>>>>> reuse?). >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> No. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Note that sometimes it takes a long time until the error >>>>>>>>>>>>>>>>>> occurs, but usually after the 50th-100th iteration the code >>>>>>>>>>>>>>>>>> crashes for me. >>>>>>>>>>>>>>>>>> (The code is totally pointless, I have removed every >>>>>>>>>>>>>>>>>> unneccessary parts) >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> István >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Thomas >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>>>>>>> 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 >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>>>>> 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 >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>>> 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 >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> _______________________________________________ >>>>>>>>>>> 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 >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>>> _______________________________________________ >>>>>>>>> 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 >>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>>> _______________________________________________ >>>>>> 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 >>>>> >>>>> >>>> >>>> _______________________________________________ >>>> 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 > >
_______________________________________________ Pythonocc-users mailing list Pythonocc-users@gna.org https://mail.gna.org/listinfo/pythonocc-users