0

私のプログラムはファイルを読み取り、次のようにインターリーブします。

ここに画像の説明を入力

読み込むファイルが大きいです。それは 4 つの部分に分割され、その後多くのブロックに分割されます。私のプログラムは、最初にパート 1 のブロック 1 を読み取り、次にパート 2 のブロック 1 にジャンプします。その後、パート 1 のブロック 2 に戻ります。

テストでパフォーマンスが低下します。その理由は、カーネルのページキャッシュ機能がそのような状況で効率的に機能しないためだと思います。しかし、ファイルが大きすぎてmmap()、ファイルは NFS にあります。

このような状況で読む速度を上げるにはどうすればよいでしょうか。コメントや提案は大歓迎です。

4

3 に答える 3

1

posix_fadvise()たとえば、システムに使用法のヒントを与えるために使用することをお勧めします。POSIX_FADV_RANDOM先読みを無効にするために使用し、場合によっては、POSIX_FADV_WILLNEED必要になる前にシステムが次のブロックをページキャッシュに読み込もうとするようにするために使用します(これを予測できる場合)。POSIX_FADV_DONTNEEDブロックの読み取りが完了したら、システムに基になるキャッシュページを解放させるために使用することもできますが、これは必要ない場合があります

于 2012-05-13T16:14:27.757 に答える
0

読み取り値を線形チャンクに分割できます。たとえば、コードが次のようになっているとします。

int index = 0;
for (int block=0; block<n_blocks; ++block) {
  for (int part=0; part<n_parts; ++part) {
    seek(file,part*n_blocks+block);
    data[part] = readChar(file);
  }
  send(data);
}

これを次のように変更します。

for (int chunk=0; chunk<n_chunks; ++chunk) {
  for (int part=0; part<n_parts; ++part) {
    seek(file,part*n_blocks+chunk*n_blocks_per_chunk);
    for (int block=0; block<n_blocks_per_chunk; ++block) {
      data[block*n_parts+part] = readChar(file);
    }
  }
  send(data);
}

次に、キャッシュの n_blocks_per_chunk を最適化します。

于 2012-05-13T16:28:59.087 に答える
0

ブロックのペアごとに、両方を読み取り、最初のものを処理し、2 番目のものをスタックにプッシュします。ファイルの最後に到達したら、スタックの一番下から値をシフトし始め、値を 1 つずつ処理します。

于 2012-05-13T16:14:38.590 に答える