我有一个非常大的文件(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()循环中的所有值。
=>不是很快。我想它可以用哈希表进行优化,我目前正在试验它。
还有其他可能性使这个过程更加高效吗?
答案 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);
可以避免不必要的副本。