0

非常に大きなインデックスファイルがあるプログラム(Linux用)を実行する必要があり、ファイルからデータを検索して解釈する必要があります。今のところ、私はいつでもxバイトのファイルのみをキャッシュすることが許可されているので(引数によって決定されます)、探しているものでない場合は、特定のデータをキャッシュから削除する必要があります。

私の理解が正しければ、fopen(r)はキャッシュに何も入れません。getcまたはfread(サイズを指定)を呼び出したときにのみキャッシュされます。

だから私の質問は、私がfreadを使用して100バイトを読み取ったとしましょうが、それをチェックした後、100バイトのうち20バイトだけが必要なデータを含んでいます。ファイルからさらに読み取るために、無駄な80バイトをキャッシュから削除(または上書き)するにはどうすればよいですか?

編集キャッシュとは、メモリに保存されたデータを意味します。これにより、問題が簡単になります。

4

4 に答える 4

2

freadの最初の引数は、メモリブロックへのポインタです。したがって、これを実行する方法は、上書きしたいものへのポインタを設定することです。たとえば、バイト20〜40を保持し、それ以外はすべて上書きするとします。a)fread開始時に長さ20で呼び出し、次にサイズ60で再度呼び出すbuffer[40]か、b)デフラグ(つまり、保持したいバイトを最初にコピーする)で開始freadし、ポインターで呼び出すことができます。次のセクションに進みます。

于 2012-11-26T23:01:40.153 に答える
2

なぜキャッシュを細かく管理したいのですか?第二に、何があなたにできると思いますか?プログラムのコマンドラインで指定された引数は、キャッシュマネージャーが内部で行うことを制御できません。ファイル全体をRAMに読み込むか、まったく読み込まないか、パーティをスローするかを決定する場合があります。あなたがそれを制御することは、低レベルのAPI /システムコールを使用し、あまりきめ細かくはなりません。

于 2012-11-26T23:06:41.940 に答える
1

要件について混乱しているかもしれませんし、要件を与えてくれた人かもしれません。あなたはオペレーティングシステムによって管理されているキャッシュを参照しているようですが、アプリケーションが心配する必要はありません。オペレーティングシステムは、自動的に大きくなりすぎないようにします。

「キャッシュ」のもう1つの意味は、自分で作成したもの、char*バッファ、またはデータを処理している間データを一時的にメモリに保持するために作成したものです。これは、そのバッファにあまり多くのメモリを割り当てないことで、自分自身を管理するのがかなり簡単なはずです。

于 2012-11-26T23:12:14.843 に答える
-1

fopen()で開いたファイルの読み取りバッファーを破棄するには、fflush()を使用できます。また、setvbuf()を使用してバッファーサイズを制御できることにも注意してください。

ただし、バッファリングを正確に制御する必要がある場合は、(fopen / freadの代わりに)open/readの使用を検討する必要があります。

于 2012-11-26T23:04:44.253 に答える