[ZODB-Dev] Old memory leak related to the ObjectWriter?

Pierre Dumonceau pierre.dumonceau at cetic.be
Thu Sep 1 09:25:05 EDT 2005


Hi,

I am involved in the maintenance of an application using ZODB and 
Zope-2.8.0-final. After some investigation I noticed what could be an 
old memory leak related to the ObjectWriter (cycle with the pickler) in 
ZODB, as can be seen running this short program:

import os, os.path
from ZODB import FileStorage, DB
import transaction
import sys
import gc

class ZODBStore:
   def __init__(self, name):
       self.name = name
       self.absPathName = os.path.dirname(os.path.abspath(name))
   def Connect(self):
       self.file = FileStorage.FileStorage(self.name)
       self.db = DB(self.file)
       self.connection = self.db.open()
       self.root = self.connection.root()
       self.transaction = transaction.begin()
   def Disconnect(self):
       self.Commit()
       self.connection.close()
       self.db.close()
       self.file.close()
   def Commit(self):
       self.transaction.commit()
   def Abort(self):
       self.transaction.abort()

if __name__ == "__main__":
   ObjectStore = ZODBStore("test.fs")
   ObjectStore.Connect()
   ObjectStore.root['Employees'] = ['Jack', 'Joe', 'Bob']
   ObjectStore.Disconnect()

   gc.enable()
   gc.set_debug(gc.DEBUG_LEAK)
   resultFile = open('resultConnectionLeak.txt', 'a+')
   gc.collect()
   for x in gc.garbage:
       msg = '>>>> Garbage ' + str(type(x)) + ' ' + str(x) + '\n     '
       msg += x.__class__.__name__ + ' at ' + str(hex(id(x))) + '\n'
       resultFile.write(msg)
   resultFile.close()   

I fixed it by adding a close function to the ObjectWriter in 
serialize.py and calling it explicitly from connection.py (modification 
found in the CVS).
def close(self):
   self._p.persistent_id = None
   self._p = None


More information about the ZODB-Dev mailing list