在大二进制文件中搜索字符串

时间:2009-08-18 13:08:47

标签: c# .net file-io

我有一个很大的二进制文件(1 MB< size< 50 MB)。我需要搜索一个字符串并提取后续的四个字节(这是另一个文件中实际数据的{size,offset})。最有效的方法是什么,以便搜索速度最快?

编辑:索引文件中的字符串按排序顺序。

4 个答案:

答案 0 :(得分:4)

答案 1 :(得分:2)

以排序顺序(按字符串)存储{string,size,offset}元组,并使用二进制搜索字符串。

您还可以在文件的开头存储每个字符串首字母的偏移量。例如,如果以'a'开头的字符串从位置120开始,而以'b'开头的字符串开始于文件中的位置2000,则可以使用120, 2000, ...

之类的内容启动文件

答案 2 :(得分:1)

如果编码是固定的(ASCII),则相对简单。打开二进制流,读取字节为byte并与targetstring的第一个char匹配。

如果您使用其他(UTF-8)编码的字符串,则会变得更加棘手。

答案 3 :(得分:0)

首先,在文件上使用内存映射。它比将其读入RAM更有效率,因为它只有一个副本,而不是两个副本(一个在程序中,一个在文件缓存中)。

如果每个字符串都是固定长度,则二进制搜索非常简单,因为您可以将内存视为字符数组的数组。

如果每个字符串都是可变长度但是0终止,那么你可以使用二进制搜索的变体,你跳到字符串列表的中间,搜索下一个0,然后测试下一个字符串。然后向前或向后跳到字符串列表的1/4或3/4并重复。

如果每个字符串都是Pascal样式的可变长度,在开头有一个字节计数就比较棘手。对于不频繁的搜索,从一开始的线性搜索不会太慢。如果您正在寻找精确的字符串匹配,请不要忘记只需检查长度不匹配就可以跳过大多数字符串。

如果你必须经常搜索列表,那么构建一个字符串列表的char指针数组将再次使二进制搜索变得非常容易。如果这个文件实际上是一个快速搜索的索引文件,那么它可能已经在其中某处,除非设计者打算在加载文件时构建一个char指针数组。