what if you do this?

class Blah():
    def __init__(self):
        self.nick = db.person[1].nick

def blah_f():
    return Blah()

 p = cache.ram('blahblah', blah_f,time_expire=30)



2011/1/2 David Zejda <d...@atlas.cz>:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Finally I had enough time to find out, where is the main root of my
> memory leak.
>
> Consider two scenarios:
>
> 1. start web2py server
>
> 2. execute controller function with contents:
>
> def blah():
>    return Storage(dict(nick=db.person[1].nick))
>
> p = cache.ram('blahblah',blah,time_expire=30)
>
> 3. guppy stats:
>
> Partition of a set of 119902 objects. Total size = 17240104 bytes.
>  Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
>     0  64658  54  5946560  34   5946560  34 str
>     1  24649  21  2172768  13   8119328  47 tuple
>     2    624   1  2091648  12  10210976  59 dict of gluon.dal.Field
>     3    706   1   888112   5  11099088  64 dict (no owner)
>     4    282   0   876912   5  11976000  69 dict of module
>     5   6701   6   804120   5  12780120  74 types.CodeType
>     6   6359   5   763080   4  13543200  79 function
>     7    652   1   571680   3  14114880  82 type
>     8    652   1   501280   3  14616160  85 dict of type
>     9    451   0   454984   3  15071144  87 dict of class
> <342 more rows. Type e.g. '_.more' to view.>
>
>
> 1. start web2py server
>
> 2. execute controller function with contents (nick is plain string):
>
> class Blah():
>    def __init__(self):
>        self.nick = db.person[1].nick
>
> p = cache.ram('blahblah',Blah,time_expire=30)
>
> 3. guppy stats:
>
> Partition of a set of 132222 objects. Total size = 21017568 bytes.
>  Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
>     0  69722  53  6343688  30   6343688  30 str
>     1   1248   1  4183296  20  10526984  50 dict of gluon.dal.Field
>     2  26193  20  2334008  11  12860992  61 tuple
>     3    756   1   987360   5  13848352  66 dict (no owner)
>     4    282   0   876912   4  14725264  70 dict of module
>     5   7056   5   846720   4  15571984  74 types.CodeType
>     6   6686   5   802320   4  16374304  78 function
>     7    654   0   573440   3  16947744  81 type
>     8    654   0   501840   2  17449584  83 dict of type
>     9    459   0   471048   2  17920632  85 dict of class
> <356 more rows. Type e.g. '_.more' to view.>
>
> Please, look at dict of gluon.dal.Field. In the second scenario the
> count is doubled, which means that db model remains in the memory twice,
> which is bad.
>
> I did not try the same with simplier model, so I do not have idea
> whether it matters.
>
> In my case it will not be too difficult to replace my own classes with
> dicts or Storages, but maybe the findings will help somebody else facing
> similar leak..
>
> Nice year to all :)
> David
>
> - --
> David Zejda, Open-IT cz
> web development & services
> http://www.o-it.info
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.9 (GNU/Linux)
> Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
>
> iEYEARECAAYFAk0gqW4ACgkQ3oCkkciamVH0JACfWPEaSQX+7/OqeGeWNhtJr4/R
> JzwAn3Z17zjKv93dxjDTuM2KorzI6LB/
> =OKMq
> -----END PGP SIGNATURE-----
>

Reply via email to