[ZODB-Dev] memory usage recommendation

Tim Peters tim at zope.com
Thu Jan 12 20:02:56 EST 2006


[DJL]
> I have a project that i want to export to nokia 770 that use zodb
> is there any recommendation to minimize the memory usage of zodb package

Don't store any objects in the database, and don't open any storages or
connections ;-)

Of course those are silly extremes, but they do point to things you have
some control over:

-  When a FileStorage is opened, it builds in-memory data structures
   to help speed the process of loading persistent data.  These
   consume memory proportional to the number of unique objects in
   the database (e.g., there's an in-memory map from an object's id
   (oid) to file offset for the most recent revision of that object).
   The more unique objects you create, the more memory this requires.

-  Each Connection you open maintains an in-memory cache, mapping
   an object id to that object.  This can consume an arbitrarily
   large amount of RAM:  there's no limit on how large an object
   may get, so even a 1-object cache could (in theory) consume all
   the RAM you have.  The fewer connections you have open simultaneously,
   the fewer such caches are created.  You can limit the size of
   the cache via DB's cache_size parameter.  This gives a target
   number of objects.  There is no way to limit cache size by byte
   count, and the target number of objects is a soft limit:  _during_
   a transaction, the cache will hold as many objects as are referenced.
   Between transactions, a cache "garbage collection" pass runs
   to throw away the least recently referenced excess over cache_size
   objects.

   So relatively small transactions with relatively small objects
   should help.

-  Relatedly, use scalable data structures:  when possible, use one
   of the BTree-based containers instead of a persistent list or dict.
   "A BTree" is actually a graph of persistent objects under the covers,
   and is specifically designed to consume memory roughly proportional
   to the number of containees a transaction _accesses_ (rather than
   the-- potentially much larger --total number of containees).
   



More information about the ZODB-Dev mailing list