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

时间:2016-08-28 11:25:59

标签: c++ string performance

我有一个非常大的文件(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()循环中的所有值。

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

还有其他可能性使这个过程更加高效吗?

2 个答案:

答案 0 :(得分:1)

将文件中的所有行存储在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 << "found\n";
    else
        std::cout << "NOT found\n";

    return 0;
}

答案 1 :(得分:0)

首先将文件加载到内存中。我猜你已经够了。

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

文件是否必须具有模式或在特定条件下排序。如果是这种情况,您可能有机会进一步优化。

还尝试使用这样的字符串引用:

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

可以避免不必要的副本。