【发布时间】:2016-08-28 11:25:59
【问题描述】:
我有一个非常大的文件(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() 循环中比较所有值。
=> 不是很快。我想它可以使用我目前正在试验的哈希表进行优化。
还有其他可能使该过程更加高效吗?
【问题讨论】:
-
为什么需要先加载整个文件,而不是读取一行,比较它,然后继续?
-
因为我会多次查询数据,而且因为磁盘访问比内存访问慢,所以我在内存中工作。 (注意:主要是查找文件,很少更改,所以我一个月只重新加载几次)
-
好的,这需要逐块读取,并在内存中正确搜索。您可以检查您的操作系统是否提供内存映射文件功能,这可能是最快的。
-
@πάνταῥεῖ - 不,不是。他的 Q 和 cmets 表明他每月有几次将整个文件加载到内存中 - 与顺序文件 IO 无关(也许除了
void loadfile(string filename);- 几乎不是优化问题)。
标签: c++ string performance