lseek
500MB のファイルを繰り返し転送し、シークごとに小さなチャンク (300 ~ 500 バイト) を読み取る方がread
、最初からファイル全体を調べてそのバイトを無視するよりも遅いように見える状況に遭遇しました。したくない。これは、シークを 5 ~ 10 回しか行わない場合でも当てはまるようです (つまり、最終的にファイルの ~1% しか読み取らない場合)。私はこれに少し驚いています.カーネル空間からユーザー空間にデータを実際にコピーしなければならない読み取りよりも、作業が少ないはずのフォワードシークがなぜ遅いのでしょうか?
おそらくローカル ディスク上で、OS がシークするときにドライブにメッセージを送信して、バスを介してデータを送り返すことなくシークすることもでき、さらに節約できます。しかし、私はネットワークマウントにアクセスしています。そこでは、読み取りがシークよりもはるかに遅いと予想されます(実際にネットワークを介してデータを転送するのではなく、Nバイト先に移動するように指示する1つのパケットを送信します)。
ローカル ディスクまたはネットワーク ファイル システムからの読み取りに関係なく、これはどのように発生するのでしょうか? 私の唯一の推測は、私が探している場所ごとに OS が大量のデータをプリフェッチしていることです。これは通常発生するものですか、それとも私のコードのバグを示している可能性がありますか?