Come posso usare functools 'lru_cache all'interno delle classi senza perdite di memoria? Nell'esempio seguente, l'istanza foo
non verrà rilasciata sebbene esca dall'ambito e non abbia alcun referrer (diverso da lru_cache).functools Python lru_cache con i metodi di classe: oggetto release
from functools import lru_cache
class BigClass:
pass
class Foo:
def __init__(self):
self.big = BigClass()
@lru_cache(maxsize=16)
def cached_method(self, x):
return x + 5
def fun():
foo = Foo()
print(foo.cached_method(10))
print(foo.cached_method(10)) # use cache
return 'something'
fun()
Ma foo
e quindi foo.big
(a BigClass
) sono ancora vivi
import gc; gc.collect() # collect garbage
len([obj for obj in gc.get_objects() if isinstance(obj, Foo)]) # is 1
Ciò significa che le istanze Esempio/BigClass continuano a risiedere in memoria. Anche l'eliminazione di (del) non li rilascia.
Perché lru_cache è ancora presente sull'istanza? La cache non usa qualche hash e non l'oggetto reale?
Qual è il modo consigliato di utilizzare lru_caches all'interno delle classi?
So di due soluzioni: Use per instance caches o make the cache ignore object (che potrebbe condurre a risultati sbagliati, però)