[Zope3-Users] Large mappings or sequences in ZODB eat all the memory

Christophe Combelles ccomb at free.fr
Wed Nov 14 07:29:16 EST 2007


Hello,

What should I do to have a data structure which is memory scalable?

Consider the following large btree:

$ ./debugzope

     >>> from BTrees.OOBTree import OOBTree
     >>> root['btree']=OOBTree()
     >>> for i in xrange(700000):
     ...   root['btree'][i] = tuple(range(i,i+30))
     ...
     >>> import transaction
     >>> transaction.commit()

Quit and restart  ./debugzope

Now I just want to know if some value is in the btree:

     >>> 'value' in root['btree'].values()

or compute the length

     >>> len(root['btree'])
(I'm already using some separate lazy bookkeeping for the length, but even if 
len() is time consuming for a btree, it should be possible from a memory point 
of view)

This loads the whole btree in memory (~500MB), and that memory never gets 
released! If the btree grows, how will I be able to use it? (>2GB)

I've tried to scan the btree by using slices, using 
root['btree'].itervalues(min,max), and by trying to do some 
transaction.abort()/commit()/savepoint()/anything() between the slices.
But every slice I parse allocates yet another amount of memory, and when the 
whole btree has been scanned using slices, it's like the whole btree was in memory.

I've also tried with lists, the result is the same, except the memory gets eaten 
even quicker.

What I understand is that the ZODB wakes up everything, and the memory allocator 
of python (2.4) never release the memory. Is there a solution or something I 
missed in the API of the ZODB or BTrees or python itself?

thanks,
Christophe






More information about the Zope3-users mailing list