有没有更好的方法来grep一个大文件中的单词(该单词可以在文件的开头或结尾)

时间:2013-09-20 09:24:47

标签: c# algorithm puzzle

我在codercharts.com上玩拼图。

我正在使用StreamReader readline和正则表达式来grep这个单词。

伪代码:

using (StreamReader r = new StreamReader(a[1]))
{
      bool found;
      while ((l = r.ReadLine()) != null){
          MatchCollection matches = Regex.Matches(l,String.Format(@"\b{0}\b",'YourWordHere'));
          found = matches.Count>0
          break;
      }
}

有效。但是在接近尾声时,表现并不好。

因为它从头到尾迭代。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

通过创建一次正则表达式并重复使用它,可以使搜索速度更快,整体运行时速度提高一倍:

            var rx = new Regex("\bword\b", RegexOptions.Compiled);
            while ((l = r.ReadLine()) != null)
                if (rx.IsMatch(l))
                    break;

否则,你不会获得太大的改进,因为大部分时间花在从磁盘加载文件上(至少对我而言 - 你会看到更快的驱动器有更大的改进)。我创建的一个大文件的结果,并将搜索到的单词放在最后:

您的代码1526 ms

我的密码:762毫秒

无代码(空时((l = r.ReadLine())!= null)循环):597 ms

如您所见,仅读取文件已花费近600毫秒。

现在,如果您可以加载文件一次,将其保存在内存中,并在需要时进行搜索 - 那么正则表达式应该相当快(在上述情况下约为100毫秒)。如果您多次搜索同一个文件,这将是一个好主意。