2

現在、メモリが非常に少ないモバイルプラットフォームのソフトウェアに取り組んでいます。I/O ボトルネック関数では、シーク操作を使用して img ファイルから数バイトを読み取る必要があります (シークは、メモリから直接読み取るよりも約 10 倍遅いと想定できます)。私のテストでは、この関数は 7480325 回呼び出され、bytes_offset 6800 から 130000 までのバイトを読み取るため、すべてのバイトは平均で 100 回読み取られます (3 ~ 4 回読み取られるバイトもあれば、1000 回以上読み取られるバイトもあります)。

以下は私の統計です。

bytes offset 6800 ~ 6900: 170884 times
bytes offset 6900 ~ 7000: 220944 times
bytes offset 7000 ~ 7100: 24216 times
bytes offset 7100 ~ 7200: 9576 times
bytes offset 7200 ~ 7300: 14813 times
bytes offset 7300 ~ 7400: 22109 times
bytes offset 7400 ~ 7500: 19748 times
bytes offset 7500 ~ 7600: 43110 times
bytes offset 7600 ~ 7700: 157976 times
...
bytes offset 121200 ~ 121300: 1514 times
bytes offset 121300 ~ 121400: 802 times
bytes offset 121400 ~ 121500: 606 times
bytes offset 121500 ~ 121600: 444 times
bytes offset 121600 ~ 121700: 398 times

max_bytes_offset 121703
min_bytes_offset 6848

次に、LRU スキーマを使用してキャッシュを構築し、I/O パフォーマンスを向上させたいと考えています。他の人の質問では、ハッシュテーブル + 二重リンク リストが良い方法だと思います。しかし、私の問題を最善の方法で改善するための構造を作るにはどうすればよいでしょうか? 1300 個のバケットを作成する予定で、すべてのバケットが最大サイズ 10 の二重リンク リストを所有しています。この場合、必要な合計メモリは約 13KB です。実装と保守は簡単ですが、効率は最高ではないと思います。

私の統計では、一部のバイト オフセット間隔ではヒット率が高く、一部の間隔ではヒット率が低くなります。統計を適応させるための構造を構築するにはどうすればよいですか?

また、キーを検索するときは、サイズ 10 のリスト全体をトラバーサルする必要があります。検索効率の高い方法は他にありますか?

一部のモバイル プラットフォームではキャッシュにより多くのメモリを使用できますが、他のプラットフォームではより少ないメモリを使用できます。バケットのサイズを変更する以外に、許可されたメモリの変更をキャッシュに適応させるにはどうすればよいですか?

cafの方法の方が良さそうです。大きな二重リンク リストと、キーをノード エントリにマッピングする大きなハッシュ テーブルを使用することは、より理にかなっていて、LRU をより活用できます。しかし、ハッシュ関数の設計は難しい問題になりつつあります。

あなたの提案を待っています、ありがとう〜

4

1 に答える 1

0

各バケットに最大 10 個のエントリしかない場合は、二重にリンクされたリストを省略して、各バケットを循環配列にする方がよいでしょう (これは 10 個のエントリと「最上部」です)。リスト」インデックス)。

10 方向のセット アソシアティブ設計を破棄し、直接マップされたキャッシュ (各バケットに 1 つのエントリのみを格納する、より大きなハッシュ テーブルがある場合) を使用することをお勧めします。セット連想設計は、専用のハードウェアを使用して n 方向の比較を並列に実行できるハードウェアでは優れていますが、ソフトウェアではそうではありません (これに利用できるベクトル ユニットがない場合)。

統計に適応する 1 つの方法は、ハッシュ関数を設計して、異なるサイズのアドレス範囲を各バケットにマップし、各バケットがほぼ同じ頻度でアクセスされるようにすることです。

キャッシュのサイズをスケーリングするもう 1 つの明白な方法は、ハッシュ テーブルのサイズを変更することです。

于 2010-07-07T08:19:46.900 に答える