在C#中搜索大二进制文件中十六进制值的有效方法是什么?

时间:2012-11-16 00:18:58

标签: c# binaryreader

HxD编辑器中的相同功能非常相似,我正在实现一个程序,该程序在大的二进制文件中搜索特定的十六进制值(比如32位)(> 1 GB)。内存是有限的,似乎在BinaryReader类中读取chunk的块很慢。 HxD在大约12秒内返回搜索结果(几乎达到文件末尾),这是可以接受的。

1 个答案:

答案 0 :(得分:5)

BinaryReader应该能够在12秒内读取一个千兆字节,前提是你的磁盘子系统可以处理它(显然它可以,因为HxD正在这样做)。关键是使用更大的输入缓冲区打开文件。也就是说,而不是:

var f = File.OpenRead(filename)

呼叫

var f = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.None, 65536);

这将导致.NET以64 KB块的形式读取文件,而不是默认的4 KB块。

虽然你使用BinaryReader的原因完全是个谜。为什么不直接读取流?例如:

var buff = new byte[1024*1024];
int bytesRead = f.Read(buff, 0, buff.Length);

使用64 KB文件缓冲区,.NET必须只对操作系统进行16次调用才能满足您的请求。使用默认的4K缓冲区,它必须对OS进行256次调用。差异非常明显。

使用大于64千字节的缓冲区大小参数不会给您带来很多性能提升。并且大于256 KB的缓冲区实际上导致系统在我的测试中读取速度变慢。 64 KB似乎是“最佳点”,至少在我测试的系统上是这样。

如果您出于某种原因决定使用BinaryReader,那么您应该期望使用较大的缓冲区来提高性能。