代码之家  ›  专栏  ›  技术社区  ›  foobarfuzzbizz

在大文件中进行搜索的最佳方法是什么?

  •  3
  • foobarfuzzbizz  · 技术社区  · 15 年前

    我希望将kmp(或类似的)搜索应用于大型文件(>4GB)。

    不过,我希望这会给我带来问题。我不能把它全部复制到内存中,因为那里没有足够的空间。

    我的问题是,做这个搜索最好的方法是什么?我应该简单地创建一个文件*并直接在文件中进行搜索吗?我应该将块(比如4K)复制到内存中并搜索这些块,还是完全搜索其他块?

    4 回复  |  直到 15 年前
        1
  •  2
  •   Stefano Borini    15 年前

    如果您使用的是支持它的平台,那么可以使用mmap()。 文件的分页也是一种可能,但请记住尽可能大的缓冲区以减少IO开销,并注意两个页面的边界之间(假设一个字符串匹配,但被页面边界分割)

    或者,我建议您构建某种索引,并使用该索引来限制搜索。国民党的搜索不是特别有效。当然,这取决于文件的性质,文件的创建方式, 等。

        2
  •  2
  •   chmike    15 年前

    对于文件访问,我建议使用内存映射文件以避免数据复制。它在Unix机器上是微不足道的。如果不能在一个块中分配文件映射,则可能需要将其拆分为较小的块。如果您感兴趣,我可以提供一些代码。

    对于搜索,我建议使用 Boyer More search algorithm .

        3
  •  1
  •   schnaader    15 年前

    直接在文件中搜索会非常慢,使用缓冲将提供更好的性能。但是请注意,你的缓冲区必须比你搜索的要大( SearchLength ,当然,当 搜索长度 结束前的字节数。

        4
  •  1
  •   Larry Watanabe    15 年前

    最好的方法是分块阅读并搜索。您应该将块大小设为一个参数,这样您就可以试验什么能提供最佳性能。

    但是,尝试以某种方式索引文件通常更有效,这样您就不必对整个文件进行线性搜索。例如,kmp是一个字符串搜索算法——你只是在寻找一个单词的出现吗?然后您可以创建一个哈希表(磁盘上)的单词及其在文件中的位置,并有非常有效的搜索。