functoolsのlru_cacheをクラスの中でメモリリークなしで使用するにはどうすればよいですか? 以下の最小限の例では、範囲外になり、リファラー(lru_cache以外)がなくても、foo
インスタンスは解放されません。クラスメソッドを持つPython functools lru_cache: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()
しかしfoo
ひいてはfoo.big
(BigClass
)は依然としてはFoo/BigClassインスタンスがまだメモリ内に存在していることを意味する
import gc; gc.collect() # collect garbage
len([obj for obj in gc.get_objects() if isinstance(obj, Foo)]) # is 1
生きています。 Foo
(del Foo
)を削除しても、それらは解放されません。
lru_cacheがインスタンスを保持しているのはなぜですか?キャッシュは実際のオブジェクトではなくハッシュを使用していませんか?
クラス内でlru_cachesを使用する推奨される方法は何ですか?
私は2つの回避策を知っている:これは、クリーンなソリューションではありませんが、それは、プログラマに対して完全に透過的です Use per instance cachesまたはmake the cache ignore object(ただし、間違った結果になるかもしれません)