2009-08-07 98 views

回答

2

这个大小的文件应该很容易适应内存,并且可以将它作为它的项目作为std :: set(或者甚至更好的哈希集合,如果有库的话)。检查一条确切的路径是否会非常快。

如果您还需要查找子路径,排序的std :: vector(如果您只查找前缀)可能是唯一有用的方法 - 或者如果您正在寻找完整的一般子串的路径,那么无论如何你都需要扫描所有的矢量,但除非你必须做数十亿次,即使这样也不会太坏。

+0

我怀疑,这是最快的方法 - 其最简单的。如果以最快的方式搜索特定路径,为了读取每一行,将其与搜索到的路径进行比较并在找到匹配后立即中止。其他一切都是开销。除此之外,std :: hash_set通常比std :: set快得多。 – 2009-08-07 11:26:06

+0

是的,我确实推荐了一个哈希集,如果你有一个库,那么尽管标准违规的'std:'前缀某些库使用,但记住它不在C++标准中。按照您的建议,将I/O和CPU工作混合在一起,以一次吞吐的方式读取几个100 KB的数据,实验速度更快(至少在多任务系统上具有良好的FS,磁盘缓存,预读等) - 今天,磁盘I/O比线性读取(100KB <1msec)要多得多,并且混合容易允许上下文切换,导致寻道(因为其他进程将在磁盘上的其他地方寻找)。 – 2009-08-07 16:07:41

+0

我花时间写了一个基准样本。你错了:用80000行读取一个5MB文件在一台好机器上需要大约0.60秒的时间,包括每行读取的strcmp。如果我省略了strcmp,而是建立了一个std :: set,运行时间增加到了0.75s。 – 2009-08-10 11:41:15

0

这是正则表达式的字段;你应该看看grep和awk。

2

您是否必须在文件中找到一个字符串,同一个字符串在多个文件中重复出现,同一个文件中有多个字符串?

根据情况,你有几个可能的答案。

  • 构建数据stucture(如由亚历克斯提议下集)是有用的,如果你有使用像Boyer-Moore的算法是有效的,如果你要搜索找到在同一个文件

  • 几串一个字符串

  • 使用正则表达式引擎可能会更好,如果你必须搜索几个字符串。

相关问题