【问题标题】:What is the best way to do a search in a large file?在大文件中进行搜索的最佳方法是什么?
【发布时间】:2010-11-15 18:48:28
【问题描述】:

我希望对大文件 (> 4GB) 应用 KMP(或类似)搜索。

我预计这会给我带来问题。我无法将其全部复制到内存中,因为那里没有足够的空间。

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

【问题讨论】:

    标签: c file search io


    【解决方案1】:

    直接在文件中搜索会很慢,使用缓冲会提供更好的性能。但是请注意,您的缓冲区必须大于您搜索的内容 (SearchLength),当然,您必须在缓冲区结束前刷新缓冲区为 SearchLength 字节。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 嗯,我正在尝试在用户提供的文件中搜索所有出现的十六进制字符串。由于文件每次都会不同,而且我正在搜索十六进制值,因此哈希表似乎不值得。
      • 没错,这就是我说“通常”的原因 :) 每个搜索问题都有些不同。我主张只分页,但同样,始终使用参数,以便您可以针对特定设置调整设置。
      【解决方案3】:

      如果您使用的是支持它的平台,则可以使用 mmap()。 文件的分页也是可以的,但是记得尽量保持缓冲区大以减少IO开销,并且要注意两个页面的边界(假设一个字符串是匹配的,但是被页面边界分割了)

      另外,我建议您建立某种索引,并使用索引来限制搜索。 KMP 搜索并不是特别有效。这当然取决于您的文件的性质、它是如何创建的,等等。

      【讨论】:

      • +1 用于使用 mmap。需要注意的是,您仍然需要在 32 位机器上以块为单位进行 mmap,因为地址空间不够。
      • 是的,mmap(至少在 OSX 上,但它是标准的 BSD)接受 size_t len 和 off_t 偏移量。 OP 需要检查这些类型是否包含 64 位值,否则他将永远无法处理超过 4 GiB 的限制。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-06-26
        • 2016-08-21
        • 2013-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多