creating garbage collectable objects (caching objects)
Dave Angel
davea at ieee.org
Mon Jun 29 12:12:38 EDT 2009
Gabriel Genellina wrote:
> <div class="moz-text-flowed" style="font-family: -moz-fixed">En Mon,
> 29 Jun 2009 08:01:20 -0300, Dave Angel <davea at ieee.org> escribió:
>> News123 wrote:
>
>>> What I was more concerned is a group of output images depending on TWO
>>> or more input images.
>>>
>>> Depending on the platform (and the images) I might not be able to
>>> preload all two (or more images)
>>>
>>> So, as CPython's garbage collection takes always place immediately,
>>> then I'd like to pursue something else.
>>> I can create a cache, which caches input files as long as python leaves
>>> at least n MB available for the rest of the system.
>
>> As I said earlier, I think weakref is probably what you need. A
>> weakref is still a reference from the point of view of the
>> ref-counting, but not from the point of view of the garbage
>> collector. Have you read the help on weakref module? In particular,
>> did you read Pep 0205? http://www.python.org/dev/peps/pep-0205/
>
> You've misunderstood something. A weakref is NOT "a reference from the
> point of view of the ref-counting", it adds zero to the reference
> count. When the last "real" reference to some object is lost, the
> object is destroyed, even if there exist weak references to it. That's
> the whole point of a weak reference. The garbage collector isn't
> directly related.
>
> py> from sys import getrefcount as rc
> py> class X(object): pass
> ...
> py> x=X()
> py> rc(x)
> 2
> py> y=x
> py> rc(x)
> 3
> py> import weakref
> py> r=weakref.ref(x)
> py> r
> <weakref at 00BE56C0; to 'X' at 00BE4F30>
> py> rc(x)
> 3
> py> del y
> py> rc(x)
> 2
> py> del x
> py> r
> <weakref at 00BE56C0; dead>
>
> (remember that getrefcount -as any function- holds a temporary
> reference to its argument, so the number it returns is one more than
> the expected value)
>
>> Object cache is one of the two reasons for the weakref module.
>
> ...when you don't want the object to stay artificially alive just
> because it's referenced in the cache. But the OP wants a different
> behavior, it seems. A standard dictionary where images are removed
> when they're no more needed (or a memory restriction is fired).
>
Thanks for correcting me. As I said earlier, I have no experience with
weakref. The help and the PEP did sound to me like it would work for
his needs.
So how about adding an attribute in the large object that refers to the
object iself?. Then the ref count will never go to zero, but it can be
freed by the gc. Also store the ref in a WeakValueDictionary, and you
can find the object without blocking its gc.
And no, I haven't tried it, and wouldn't unless a machine had nothing
important running on it. Clearly, the gc might not be able to keep up
with this kind of abuse. But if gc is triggered by any attempt to make
too-large an object, it might work.
DaveA
More information about the Python-list
mailing list