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

Zei*_*iga 3 c# binaryreader

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

Jim*_*hel 5

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

var f = File.OpenRead(filename)
Run Code Online (Sandbox Code Playgroud)

呼叫

var f = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.None, 65536);
Run Code Online (Sandbox Code Playgroud)

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

虽然你使用BinaryReader它的原因有点神秘.为什么不直接读取流?例如:

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

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

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

如果您BinaryReader出于某种原因决定使用,则应该预期使用较大的缓冲区会有类似的性能提升.