与HxD编辑器中的相同功能非常相似,我正在实现一个程序,该程序在大二进制文件(> 1 GB)中搜索特定的十六进制值(比如 32 位)。内存是有限的,而且似乎逐块读取BinaryReader
类的速度很慢。HxD 在大约 12 秒内返回搜索结果(几乎到达文件末尾),这是可以接受的。
问问题
2143 次
1 回答
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 缓冲区,它必须对操作系统进行 256 次调用。差异是显着的。
使用大于 64 KB 的缓冲区大小参数并不能提高性能。在我的测试中,大于 256 KB 的缓冲区实际上导致系统读取速度变慢。至少在我测试的系统上,64 KB 似乎是“最佳位置”。
如果您出于某种原因决定使用BinaryReader
,您应该预期更大的缓冲区会带来类似的性能提升。
于 2012-11-16T01:10:17.280 回答