計算を高速化するために比較的小さい(< 10000エントリ< 1kb)キャッシュが必要なことがよくあります。私の通常のコードは次のようになります:小型でシンプルなキャッシュに最適なデータ構造は何ですか
cache = {}
def calculate_caches(parms):
if parms not in cache:
cache[parms] = calculate(parms)
return cache[parms]
正常に動作しますが、長時間実行されるプロセス私はメモリリークを恐れています。だから私は、多くの場合、このようにクランプ強引なメモリを実装:
if len(cache) > 1000:
cache = {}
は、ほとんどのケースでも、合理的作品と、まだきれいな、簡単なコードです。しかし、私が本当にしたい場合LRU strategy私はキャッシュエントリと一緒にタイムスタンプが必要です。これに対してdictを使用する際の問題は、キャッシュが期限切れになるということは、エレガントで効率的ではないキャッシュ全体をトラバースすることを意味します。
cache = {}
def calculate_caches(parms):
if parms not in cache:
cache[parms] = (time.time(), calculate(parms))
expire()
return cache[parms][1]
def expire()
if len(cache) > 1000:
mintime = time.time()
time2key = {}
for key, (timestamp, val) in cache.items():
mintime = min([mintime, timestamp])
time2key[timestamp] = key
if mintime in time2key:
del cache[time2key[mintime]]
アドホックキャッシングを実装するための適切なアプローチ/データ構造はありますか?
私の問題はthis questionと非常によく似ていますが、リストを時間順に並べる必要はありません。私は二重引用符を付けたくありません。