web-dev-qa-db-ja.com

最も効率的なキャッシュ交換アルゴリズム

ウィキペディアには11個の キャッシュ置換アルゴリズム がリストされています。開発するアプリケーションについてほとんど何も知らないと仮定すると、「デフォルト」のキャッシュ置換アルゴリズムとして何を使用すればよいですか?

私のOSコースから正しく思い出せば、LRUは最も一般的なキャッシュ交換アルゴリズムです。しかし、多分私は間違っています。

また、一般的にメインメモリは安価で豊富であり、キャッシュサイズをあまり気にする必要がないため、これは少し学術的な質問です。

12
ashes999

最良の答えは、それが場合によって異なるということだと思います。私の経験では、キャッシングアルゴリズムの選択に入る多くの要因があります。

考慮すべき要素

  1. 読み取り/書き込みバランス。 (アクセスの何パーセントが読み取りと書き込みであるか)
  2. キャッシュの量。
  3. キャッシュの背後にあるメディアのタイプ。 (遅いSATAドライブまたは速いSSDドライブですか?)
  4. ヒットvsミス。 (物事はどのくらいの頻度で書き直されるか、再読されますか?)
  5. 平均アクセスサイズ(これはページサイズの選択に入ります)
  6. 読み取りと書き込みのコストはどれくらいですか。

さまざまな要因をすべて検討したら、それを最適に処理するキャッシュアルゴリズムを見つける必要があります。たとえば、大量の書き込み、一部の再書き込み、最近書き込まれたデータの読み取り、ある種の回転するメディアがあるアプリケーションがあるとします。この場合、一種のハイブリッドキャッシュアルゴリズムが必要になります。書き込みデータを処理するには、書き込みの賢明な順序(WOW)や、ディスクから読み取られたデータのLRUアルゴリズムなどが必要になる場合があります。この理由は、ディスクアクセスは非常に高価であり、WOWアルゴリズムはデータの書き込みをより効率的にし、LRUは頻繁にアクセスされるデータを常にキャッシュに保持するためです。

アクセス時間が非常に速いSSDディスクを使用している場合、ディスクアクセスは比較的安価であるため、LRUアルゴリズムを選択することをお勧めします。

だから私が本当に言いたいのは、「最良の」答えはないということです。最良の答えは、あなたに当てはまる要素を知り、それらを最もよく処理するアルゴリズムを選択することです。

アルゴリズムの見つけ方

システムのプロファイルを作成します。これには通常、メモリアクセスの統計を保持するコードの追加が含まれます。プロファイリングにより、どの要素が最も重要であるかを確認できます。

過去に、すべてのメモリアクセスを一定期間追跡するコードを追加しました。その後、私はパターンを探します。再読み込み、再書き込み、シーケンシャルアクセス、ランダムアクセスなどを探しています。

重要なものを特定したら、さまざまなタイプのキャッシングアルゴリズムをすべて調べて、どの処理が最適であるかを確認する必要があります。

15
barrem23

開発するアプリケーションについてほとんど何も知らないと仮定すると、実際にキャッシュシステムを選択して実装する前に、そのアプリケーションについてさらに理解する必要があります。言い換えると、デフォルトの実装はありません。いくつかはある目的に適していますが、他の目的にはまったく悪いものです

たとえば、「最近使用されていない」と「使用頻度が最も低い」という2つの実装だけを取り上げます。どちらを使用するかを決める方法は?

  • LRUは、ユーザーが最新のアイテムにアクセスする頻度が高く、古いアイテムに戻ることはほとんどないか、ほとんどない場合に適しています。例:電子メールクライアントの一般的な使用法。ほとんどの場合、ユーザーは常に最新のメールにアクセスしています。読んだり、延期したり、数分、数時間、または数日で戻ったりします。2年前に受信したメールを検索することもありますが、最近の2時間に受信したメールにアクセスするよりも頻度は低くなります。

  • 一方、LRUは、ユーザーが他のアイテムよりもはるかに頻繁にいくつかのアイテムにアクセスする状況では意味がありません。例:私は好きな音楽を頻繁に聴いています。400曲の場合、同じ曲を少なくとも週に1回は聴くかもしれませんが、年に最大で1度は100曲も好きではありません。たくさん。この場合、LFUがより適切です。

実装を2つだけとると、どちらが良いかを考えたくない場合や、アプリケーションに関する十分な情報がない場合に使用できる「デフォルト」のアルゴリズムがないことがわかります。それはまあ、それについて何も知らないときにデフォルトで、計算の結果を見つけるために2つの数値を加算、減算、乗算、または除算する必要があるかどうかを尋ねるようなものです。

9

なぜウィキペディアだけに選択肢を限定するのですか? ACM Digital Library のような研究データベースにアクセスできる場合は、さらに多くのアルゴリズムが見つかります。特許をいじることにも注意してください。たとえば、ARCは優れたアルゴリズムですが、残念ながら特許を取得しています。

3
sakisk

「最良の」アルゴリズムに苦労して多くの時間を費やすか、単純なアルゴリズムを実装して、システムにRESTシステムを導入する。テスト可能なものがある場合次にアルゴリズムについて心配。

時期尚早の最適化...

2
Ross

完璧なキャッシュアルゴリズムはありません。常に動作が非常に悪いケースを見つけることができます。

したがって、最も悪い動作をしない問題を特定するには、キャッシュされている問題を知ることが重要です。

また、どれだけ長く必要をキャッシュするか、どれくらい長くcanキャッシュするかを検討する必要があります...

0
user1249