我有一个大约70MB大小的二进制文件。在我的程序中,我有一种方法,可以对字节数组模式与该文件进行比较,以查看它们是否存在于文件中。我需要运行1-10百万个这样的模式。以下是我可以考虑的选项:
谢谢。
编辑:感谢 @MySkullCaveIsADarkPlace,现在我有了第四个比上述三个方法更快的方法。我曾经使用过有限的byte[]查找算法,现在我正在使用略微比上述三种方法更快的
这些模式每个包含12-20字节。
- 通过使用
byte[] file = File.ReadAllBytes(path)
将文件读入内存,然后对字节数组模式与文件字节进行比较。我使用了许多不同主题上的方法来实现这一点,如: byte[] array pattern search Find an array (byte[]) inside another array? Best way to check if a byte[] is contained in another byte[] 但是,当源数据很大时,byte[]与byte[]之间的比较非常慢。在普通计算机上运行1百万个模式需要数周时间。 - 将文件和模式都转换为十六进制字符串,然后使用
contains()
方法进行比较。这比byte[]
比较快,但是将字节转换为十六进制会导致内存中的文件变大,从而增加处理时间。 - 使用
Encoding.GetEncoding(1252).GetBytes()
将文件和模式都转换为字符串,然后执行查找。然后通过运行contains()
匹配另一个执行byte[]查找的方法(建议选择第一种方法)来补偿二进制到字符串转换的限制(我知道它们是不兼容的)。这对我来说是最快的选项。
谢谢。
编辑:感谢 @MySkullCaveIsADarkPlace,现在我有了第四个比上述三个方法更快的方法。我曾经使用过有限的byte[]查找算法,现在我正在使用略微比上述三种方法更快的
MemoryExtensions.IndexOf()
byte[]查找方法。尽管这个方法更快,但查找仍然很慢。1000个模式查找需要1分钟。这些模式每个包含12-20字节。