[ZODB-Dev] memory or cache leak?
Andrew Dalke
Andrew Dalke" <dalke@dalkescientific.com
Thu, 1 Nov 2001 23:31:52 -0700
Jeremy Hylton <jeremy@zope.com>:
> - Commented out the Catalog-related stuff; it's not part of
> StandaloneZODB and didn't appear to be used by the app.
Agreed. It's leftovers from the original code I was hacking
down to get a reproducible.
>If I change the arguments to cacheMinimize() and cacheFullSweep() from
>0 to 4, the memory usage seems to be capped at 37MB. The cache size
>still seems to grow frequently, but it occasionally goes down.
Just *how* did you decide to try out 4? The docs at
http://www.zope.org/Documentation/Developer/Models/ZODB/ZODB_Architecture=
_DB
_cacheMinimize--PyInt_Doc.html
say
] The age parameter is used to indicate that objects that haven=92t been
] accessed in age seconds should be deactivated.
so I only tried 0 and 1 ... and time.time() in case it was more like
pack and took a floating point timestep in seconds from epoch start.
Looking at the comments in the source code, I see cacheFullSweep does
less work than cacheMinimize. If I call cacheFullSweep(4) every 100
records through the database then everything runs just fine, and the
cacheSize never gets above about 20,000.
Yippee!
With my real data set I need to do the sweep about every 100 records.
I didn't want to expose that requirement to client code so my
interface always calls cacheFullSweep(4) every 100 calls to
Molecule.__getitem__. Seems to work, and the overhead of calling
the function when it isn't needed is about 1 millisecond.
[in another email, Jeremy said]
> Perhaps [the code around line 155 of cPickleCache.c] should
> become this --
>
> if (dt < 0)
> dt =3D 0;
> else {
> dt /=3D 3;
> if (dt =3D=3D 0)
> dt =3D 1;
> }
>
> I can't imagine anyone depends on 1 or 2 being treated as 0.
I completely agree. 'Course, the other solution is to fix the
documentation to describe this.
Thanks everyone for helping me work around this problem. I
hope you all figure out what's going on.
Andrew
dalke@dalkescientific.com