0

dbms スタイルのアクセス パターンでファイルを読み取るための最良の方法は何ですか? 私は次のことを意味します:

  • フェッチする必要があるページのオフセットを事前に知っています。
  • 連続したページの長いランがあります。
  • 小さな不連続性がある場合があります。
  • 長い不連続がある場合があります。
  • すべてのオフセットが順序付けられます (前後の動きはありません)。

このようなオフセット リストの例: 1,2,3,4,5,6,7,8,1000,1001,1003,1004,1005,1010,1011,1012,31004,31005,31006。

最高のパフォーマンスを得るためにどの戦略を使用すればよいか、少し混乱しています。

  • Linux ページマネージャーに頼るべきですか? どうやって?オフセットをループして、一度に 1 ブロックずつ読み取りますか?
  • O_DIRECT でファイルを開き、自分自身を管理します。つまり、長い読み取りとシークを交互に行います。この場合、先読みを無効にしますか?
4

1 に答える 1

1

それが最終的に「最良」であるかどうかはわかりませんが、おそらくmmap()ファイルを使用madvise()して、システムに事前フォールトページ範囲を強制しようとします。明らかに、連続した範囲を特定するためにオフセットリストで少し計算する必要があります(実際には必要ありませんが、そのmadvise()ような範囲がたくさんある場合は、呼び出しが削減され、効率が少し向上します)。プレフォールトまでの時間は、実行しようとしている計算を実行するために各ページ/範囲に費やす時間に依存するため、いくつかのテスト/調整が必要になります。madvise()また、範囲を使い終わった後はその範囲が不要になることを示唆するために使用することもできます。そのため、次に解放されるリストの先頭に移動する可能性があります。

于 2012-07-17T19:22:06.803 に答える