在文件中搜索字符串最快的方法是什么?

What is the fastest way to search strings in a file?

本文关键字:方法 是什么 文件 搜索 字符串      更新时间:2023-10-16

我有一个非常大的文件(100 MB),其中包含字符串,我正在搜索一种高性能的方式来查询文件中是否有给定的字符串。整行应该与输入字符串进行比较。

我的想法是一个程序加载文件,然后,它可以查询字符串是否存在。

void loadfile(string filename);
bool stringAvailable(string str);

loadfile()函数不需要很快,因为它偶尔会被调用。但是stringAvailable()需要尽可能提高性能。

现在我已经试过了:

1。让linux命令行工具为我做这项工作:

system("cat lookup | grep "^example$"");

=>不是很快。

2。有一个MySQL数据库,而不是一个文件(我尝试MyISAM和InnoDB),并查询它像SELECT count(*) FROM lookup WHERE str = 'xyz'

=>非常快,但还可以更快。此外,最好有一个不依赖于DBMS的程序。

3。具有字符串数组(string[] ary),并在for()循环中比较所有值。

=>不是很快。我想它可以用哈希表来优化,我目前正在试验。

是否有其他可能使过程更高效?

将文件中的所有行存储在std::unordered_set中。

#include <iostream>
#include <unordered_set>
#include <string>
int main(int argc, char **argv)
{
    std::unordered_set<std::string> lines;
    lines.insert("line 1");
    lines.insert("line 2");
    std::string needle = argv[1];
    if (lines.find(needle) != lines.end())
        std::cout << "foundn";
    else
        std::cout << "NOT foundn";
    return 0;
}

首先将文件装入内存。我想你已经够多了。

然后我会尝试在内存中进行线性搜索。如果你开始寻找第一个字符,停在那里,寻找你正在寻找的连续字符。如果两个连续字符不匹配,继续从第一个字符开始搜索,依此类推。

文件是否必须有模式或在某些条件下进行排序?如果是这样的话,你可能有机会进一步优化。

也可以尝试像这样使用字符串引用:

void loadfile(const string &filename);
bool stringAvailable(const string &str);

这样可以避免不必要的复制。