developer's diary

最近はc#のエントリが多いです

キャッシュアルゴリズムの情報収集

そもそもキャッシュとは

ja.wikipedia.org

様々な情報伝達経路において、ある領域から他の領域へ情報を転送する際、その転送遅延を極力隠蔽し転送効率を向上するために考案された記憶階層の実現手段

参考

wikipediaにあるキャッシュアルゴリズムをそれぞれ調査

wikipedia のキャッシュアルゴリズムを元に、それぞれ調査

ja.wikipedia.org

Least Recently Used (LRU) [直訳:最近使用されていない]

最近最も使われていないデータを最初に捨てる。このアルゴリズムでは、どのデータがどの時点で使われたかという情報を保持する必要があり、本当に最近最も使われていないデータを常に捨てるようにしようとすると、かなり手間がかかる。一般的実装では、キャッシュライン毎に世代ビット群(age bits)を持たせ、どのラインが最近最も使われていないかを世代ビット群で判断する。その場合、あるキャッシュラインを使うときには、常に全キャッシュラインの世代ビット群を更新する必要がある。

言語 リンク
javascript Javascript/LRUCache.js at master · TheAlgorithms/Javascript · GitHub
javascript GitHub - rsms/js-lru: A fast, simple & universal Least Recently Used (LRU) map for JavaScript
c# LRUCache.NET/LRUCache.cs at master · AvetisG/LRUCache.NET · GitHub
ptyhon GitHub - stucchio/Python-LRU-cache: An in-memory LRU cache for python

en.wikipedia.org

ja.wikipedia.org

利用箇所とか

Oracleのバッファキャッシュなどは、このアルゴリズムだそう。

blogs.oracle.com

docs.oracle.com

RedisもLRUがあるよう。

mogile.web.fc2.com

Most Recently Used (MRU) [直訳:最近使用された]

最近最も使われたデータを最初に捨てる。アクセスに局所性を想定できず、LRUの実装が複雑すぎる場合に使われる。MRUの使用例としてはデータベースのメモリキャッシュがある。

言語 リンク
javascript mrulist/jquery.mrulist.js at master · vanderlee/mrulist · GitHub
c# Caching_Service_and_LRU_-_MRU_algoritm/MRUAlgorithm.cs at master · cristianpirvanescu/Caching_Service_and_LRU_-_MRU_algoritm · GitHub

en.wikipedia.org

「最近開いたファイル」も、Most Recently Usedと呼ぶらしい(ややこしい・・・)

Pseudo-LRU (PLRU) [直訳:擬似的-最近使用されていない]

例えば、キャッシュメモリの連想度が大きい場合(4ウェイ以上)、LRUの実装コストは無視できなくなる。確率的にほぼ常に最近最もつかわれていないデータを捨てれば十分という場合、PLRUアルゴリズムを使う。この場合、キャッシュライン毎に1ビットの情報を保持するだけでよい。

言語 リンク
java LRU-Cache/PseudoLRUCacheSet.java at master · houli/LRU-Cache · GitHub

en.wikipedia.org

Least Frequently Used (LFU) [直訳:使用頻度が最も低い]

各データが使われた頻度を保持する。そして、頻繁には使われていないデータを最初に捨てる。

言語 リンク
javascript Javascript/LFUCache.js at master · TheAlgorithms/Javascript · GitHub

en.wikipedia.org

Adaptive Replacement Cache (ARC) [直訳:適応的置換キャッシュ]

LRU と LFU の間でバランスをとり、最適な結果を得る方式。最近キャッシュから消された情報の履歴を保持するように拡張し、その情報を使って、「かつてキャッシュされていたけれど今はキャッシュから消されている」という情報を元に、LRUとLFUの配分を動的に自動的に調整する。以下の4つのキューを使う。

  1. LRU (アクセス回数が1回。常にLFUよりも大きな容量を割り当てる。)
  2. LFU (アクセス回数が2回以上のデータ)
  3. かつてLRUに入っていた (これ自体もLRU)
  4. かつてLFUに入っていた (これ自体もLRU)
言語 リンク
javascript node-arc-cache/arc.js at master · ex1st/node-arc-cache · GitHub
javascript GitHub - alexanderGugel/arc-js: An Adaptive Replacement Cache (ARC) written in JavaScript.

en.wikipedia.org