HxDエディターの同じ機能と同様に、大きなバイナリファイル (> 1 GB)で特定の 16 進数値 (たとえば 32 ビット) を検索するプログラムを実装しています。メモリは限られており、チャンクごとの読み取りはBinaryReader
クラスではかなり遅いようです。HxD は、許容できる約 12 秒で検索結果 (ファイルのほぼ最後に到達) を返します。
1 に答える
BinaryReader
ディスクサブシステムがそれを処理できれば、12秒で1ギガバイトを読み取ることができるはずです(HxDが処理しているため、明らかに処理できます)。重要なのは、より大きな入力バッファでファイルを開くことです。つまり、以下ではなく:
var f = File.OpenRead(filename)
電話
var f = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.None, 65536);
これにより、.NET は既定の 4 KB チャンクではなく 64 KB チャンクでファイルを読み取るようになります。
なぜあなたがBinaryReader
まったく使っているのかは謎のようなものですが。ストリームを直接読み取らないのはなぜですか? 例えば:
var buff = new byte[1024*1024];
int bytesRead = f.Read(buff, 0, buff.Length);
64 KB のファイル バッファーを使用すると、.NET は要求を満たすために OS に対して 16 回の呼び出しを行うだけで済みます。デフォルトの 4K バッファーを使用すると、OS に対して 256 回の呼び出しを行う必要があります。その違いは顕著です。
64 キロバイトを超えるバッファ サイズ引数を使用しても、パフォーマンスはあまり向上しません。また、256 KB を超えるバッファーを使用すると、実際にテストでシステムの読み取りが遅くなりました。少なくとも私がテストしたシステムでは、64 KB が「スイート スポット」のようです。
BinaryReader
何らかの理由で使用することにした場合は、より大きなバッファーで同様のパフォーマンスの向上が期待できます。