最も効率的なキャッシュ置換アルゴリズム[終了]


12

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

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

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


1
プリフェッチはアプリケーションに関連していますか?その場合、アルゴリズムを選択する際に、プリフェッチと保持の戦略を一緒に考慮する必要があります。
-rwong

目的のアプリケーションドメインを代表するサンプルトレース(データアクセスパターンのリスト)を取得する必要があります。アカデミックリサーチから一般公開されているテストセットを見つけることができる場合があります。その後、各アルゴリズムを実装し、シミュレーションを行い、調査結果を報告できます。それができない場合は、LRUを使用します。
rwong

1
「アプリケーションについてほとんど何も知らない」場合、「効率的な」キャッシュ置換アルゴリズムについて考えるのはかなり早いです。
アノン

メインメモリは安価かもしれませんが、パフォーマンスが重要な問題である場合、アクセス効率が重要になります。新しいコンピュータのチーフアーキテクトでない限り、キャッシュ交換戦略を選択できるとは思わない。私たちの残りは、市場が提供するものは何でも手に入ります。高速に処理する必要がある場合は、計算とデータ構造を整理して、メモリ階層を効率的に使用する必要があります。
オメガケンタウリ

1
@Omega CentauriあなたはCPUキャッシュだけを考えていますが、もっとたくさんあります。OSは使用済みのファイルとディレクトリをキャッシュし、データベースはデータをキャッシュします。ほとんどのアプリケーションは多くのキャッシュを実行します(たとえば、既に計算された結果)。
maaartinus

回答:


15

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

考慮すべき要素

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

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

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

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

アルゴリズムを見つける方法

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

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

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


要因の大きな内訳。しかし、私はアプリのドメインと要因を知っているので、それらを適用する方法がわかりません。
-ashes999

@ashes:古いエンジニアリング手法があります:いくつかの異なる方法でビルドし、どれが最適に機能するかを測定します。
ドナルドフェローズ

「キャッシュ」と聞いたとき、メモリとCPUレジスタ間のストレージを思い浮かべます。ここでは、メモリと1つまたは複数のI / Oデバイスの間のレイヤーであるディスクキャッシュについて説明しています。
オメガケンタウリ

@ barrem23分散プログラミングを行っている場合、「キャッシュとキャッシュされるバックエンドストレージとの距離」も考慮する必要があります。ストレージが15ミリ秒離れている場合、SSDまたは大きな安定したストレージとして回転する錆がある場合、それは重要ではありません。
バティーン

9

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

たとえば、Least Recent UsedおよびLeast Frequently Usedの2つの実装のみを取り上げます。どちらを先に使用するかを決定する方法は?

  • LRUは、ユーザーが最新のアイテムに頻繁にアクセスし、古いアイテムに戻らないか、めったに戻らないことが確実な場合に適しています。例:電子メールクライアントの一般的な使用法。ほとんどの場合、ユーザーは常に最新のメールにアクセスしています。彼らはそれらを読んで、延期し、数分、数時間または数日で戻ってきます。2年前に受け取ったメールを探していることに気づくことができますが、最後の2時間に受け取ったメールにアクセスするよりも頻繁に起こりません。

  • 一方、LRUは、ユーザーが他のアイテムよりも頻繁にいくつかのアイテムにアクセスするというコンテキストでは意味がありません。例:好きな音楽を頻繁に聴いていますが、400曲で、少なくとも週に1回は同じ5曲を聴きますが、1年に1回しか聴かないのが嫌いな曲ですずっと。この場合、LFUの方がはるかに適切です。

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


では、アルゴリズムを選択するにはどうすればよいですか?ウィキペディアのリストを調べて、何が最適かを確認してください。
-ashes999

@ ashes999:まさに!最初に、実行するアプリケーションの要件について詳しく学習し、次にさまざまなキャッシュアルゴリズムの長所と短所を分析し、最後に、より適切なものを選択します。
Arseni Mourzenko

3

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


2

「最良の」アルゴリズムに苦労するか、単純なアルゴリズムを実装してシステムの残りの部分に取り掛かることができます。あなたが何かのテスト可能なを持っている場合は、その後、アルゴリズム心配。

時期尚早の最適化...


0

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

したがって、最も悪い振る舞いをするものを判別するために、キャッシュされている問題を知ることが重要です。

また、あなたはどのくらい考慮されなければならない必要なものをキャッシュすると、どのくらいあなたができる事をキャッシュし...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.