2

次のような状況の C/C++ 混合プロジェクトで作業しています。

ファイル内の非常に小さなチャンク (まれに大きなチャンクも) を 1 つずつ処理するには、反復処理が必要です。理想的には、それらを 1 回連続して読むだけです。この場合、必要なときにそれぞれを即座に読み取るのではなく、大きなチャンクをバッファーに読み取って後で消費する方が良い解決策になると思います。

問題は、キャッシュ サイズのバランスを取る方法です。利用できるよく知られたアルゴリズム/ライブラリはありますか?


更新: (タイトルを変更します)

皆さんの返信に感謝します。私たちのボックスでは、さまざまなレベルのキャッシュ メカニズムが機能していることを理解しています。しかし、私の場合はそれだけでは十分ではありません。

ここで重要なことを見逃したと思います。実際、私は既存のフレームワークに基づいてアプリケーションを構築していますが、エンジンに頻繁に読み取りを要求するとコストがかかりすぎます。(はい、エンジンは OS およびディスク レベルのキャッシュを利用していると思います。) そして、私がやろうとしているのは、アプリケーション レベルのプリフェッチ システムを構築することです。

考え?

4

2 に答える 2

0

一般に、独自のキャッシュを作成するのではなく、OS が提供するものを使用するようにしてください (2 回キャッシュするリスクがあるため)。Linux の場合、 readahead()を介して OS レベルのキャッシュを要求できます。Windowsの同等物が何であるかわかりません。

これをもう少し調べてみると、 blockdev --setraで設定されたブロック レベル (つまりディスク) パラメーターもあります。システムでそれを変更することはおそらく良い考えではありませんが (この 1 つのタスクだけに専念している場合を除きます)、そこの値 (blockdev --getra) が通常のチャンク サイズよりも既に大きい場合は、変更する必要がない場合があります。他に何か。

[そして、質問のコメントで言及されている他の点に対処するために-OSはファイルデータを空きメモリにキャッシュしますが、そうでなければ未読のファイルを先制的に読み取るとは思いません(上記の要件を満たすことは別として) . しかし、誰かが別の方法を知っている場合は、詳細を投稿してください...]

于 2012-03-06T23:04:57.450 に答える
0

mmap()ファイルから ing する代わりに、ファイルを ingしようとread()しましたか? これがより効率的な場合もあれば、そうでない場合もあります。ただし、システムはアプリケーションよりもハードウェアのことをよく知っているため、通常はシステムに最適化させるのが最善です。mmap()ファイル全体が必要であることをシステムに知らせるため、より最適な場合があります。

于 2012-03-08T19:27:09.400 に答える