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

本文关键字:文件 单词可 开头 结尾 方法 更好 grep 有没有 单词 | 更新日期: 2023-09-27 18:32:02

我在 codercharts.com 上玩一个谜题。

我正在使用StreamReader阅读行和正则表达式来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;
      }
}

它有效。但是在接近结尾处理一个词时,表现并不好。

因为它从头到尾迭代。

有什么建议吗?

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

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

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

否则,您不会获得太大的改进,因为大部分时间都花在从磁盘加载文件上(至少对我来说 - 使用更快的驱动器,您会看到更大的改进)。我创建了一个大文件的结果,并将搜索的单词放在末尾:

您的代码 1526 毫秒

我的代码:762 ms

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

如您所见,仅读取文件就已经需要近 600 毫秒。

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