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

我希望这会给我带来麻烦。我无法将它全部复制到内存中,因为那里没有足够的空间。

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

有帮助吗?

解决方案

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

或者,我建议您构建某种索引,并使用索引来限制搜索。 KMP搜索效率不高。这当然取决于文件的性质,文件的创建方式,等。

其他提示

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

对于搜索,我建议使用 Boyer More搜索算法

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

最好的方法是用块读取它并搜索它。您应该将块大小作为参数,以便您可以尝试提供最佳性能的内容。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top