0

興味のあるデータがファイル全体で区切られているバイナリファイルを読み込もうとしています。どの読み取りパターンが優れていますか?(最初のストリーム位置がバイト0にあると仮定します)

  1. read(count = 8192)、seek(offset = 20480、origin = Current)、read(count = 8192)、seek(offset = 12288、origin = Current)
  2. read(count = 8192)、seek(offset = 28672、origin = Begin)、read(count = 8192)、seek(offset = 49152、origin = Begin)

.NET Streamsを使用すると、SeekOriginを選択できるので、どちらのシークパターンが優れているか、から始まるパターンかSeekOrigin.BeginSeekOrigin.Current位置からシークを続けるシークパターンかを選択できます。

それは重要ですか?OSは計算自体を実行して、私のために決定することはできませんか?

4

1 に答える 1

1

それは問題ではありません。SeekOrigin.Currentは、絶対位置を自分で追跡する必要がないようにするための便利なオプションです。Windowsはすでにこれを内部で行っているため、現在のオフセットを開始オフセットに変換するのに問題はありません。それが本当に必要なものです。OSが20480をシークし、次に12288を自動的にシークできるとどのように判断したかは不明です。それはできません、Windowsにはレコードサイズの概念がありません。ファイルは単なるバイトのストリームであり、構造はありません。

あなたが求める正確な順序重要です。プログラムは、ファイルの場所に順番にアクセスすることで最速で実行されます。これは、データがディスクプラッタに書き込まれ、ディスクプラッタから読み取られる方法の副作用です。通常、ディスクが大きく断片化されていない場合は、順次実行されます。ファイルシステムキャッシュが利用するものは、取得するのが非常に安価で、使用される可能性がかなり高いため、同じディスクトラックからデータを先読みします。順番に検索することで、データがキャッシュに存在する可能性を最大化できます。非常に高速なメモリ間コピーの料金を支払うだけで、ディスクを待つ必要はありません。

于 2012-07-29T17:10:30.383 に答える