3

HxDエディターの同じ機能と同様に、大きなバイナリファイル (> 1 GB)で特定の 16 進数値 (たとえば 32 ビット) を検索するプログラムを実装しています。メモリは限られており、チャンクごとの読み取りはBinaryReaderクラスではかなり遅いようです。HxD は、許容できる約 12 秒で検索結果 (ファイルのほぼ最後に到達) を返します。

4

1 に答える 1

5

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何らかの理由で使用することにした場合は、より大きなバッファーで同様のパフォーマンスの向上が期待できます。

于 2012-11-16T01:10:17.280 に答える