[Metakit] [Fwd: memory leaks in python interface [was Hash view questions]]

Ralf Schmitt ralf at brainbot.com
Mon Feb 6 13:27:08 CET 2006


[sorry if this has been posted twice]

zooko at zooko.com wrote:
>> Your sample code does show increasing memory use on my setup as  
>> well.  Is there a way to find out what the content or at least sizes/ 
>> counts of the leaked memory areas is in Python?
> 
> Yes!  A beautiful tool known as valgrind [1].  It tells me that you are right
> and the C++ metakit code is exonerated.
> 
> This is because the stack traces of the code that allocated the leaking memory
> do not have any metakit functions in them.  Hm... the biggest one has
> posix_read() in it.  The other two are both involving allocation of Python
> Ints...
> 
> Regards,
> 
> Zooko
> 

Using a debug build of python (i.e. configure --with-pydebug), one
notices a massive amount references not being decref'ed. I'll have a 
look at it.

- Ralf


$ cat t.py
#! /usr/bin/env python

import sys
import os
import metakit
import gc

def doit(num):
    store = metakit.storage("leakcheck", 1)
    db = store.getas("test_db[k:B]")

    for i in xrange(num):
        k = os.urandom(20)
        db.append(k=k)
        db.delete(db.find(k=k))
#        if i % 100 == 0:
#            store.commit()


def main():
    if len(sys.argv)==1:
        for x in [0, 100, 1000, 2000]:
            os.system("./t.py %s" % x)
    else:
        print
        num = int(sys.argv[1])
        doit(num)
        gc.collect()
        print "done. %s iterations." % num

if __name__=='__main__':
    main()

ralf at schrotti:~$ ./t.py

done. 0 iterations.
[8211 refs]

done. 100 iterations.
[9711 refs]

done. 1000 iterations.
[23211 refs]

done. 2000 iterations.
[38211 refs]
[8208 refs]








More information about the Metakit mailing list