【问题标题】:What is the fastest way in C# to find a pattern in a group of files?在 C# 中查找一组文件中的模式的最快方法是什么?
【发布时间】:2009-04-02 17:43:10
【问题描述】:
using System;
using System.IO;
using System.Reflection;
using System.Text.RegularExpressions;

namespace regex
{
  class MainClass
  {
    public static void Main(string[] args)
    {
      Regex exp = new Regex(@"e(-)?m[a@]il(s)?|input|output|padr(ão|ões)|máquina(s)?|reconhecimento",
                            RegexOptions.IgnoreCase | RegexOptions.Compiled |
                            RegexOptions.Multiline  | RegexOptions.ExplicitCapture);

      for (int filecount = 0 ; filecount < 22 ; filecount++)
      {
        string file = "/home/files/file"+ string.Format("{0:0#}",filecount) + ".txt";
        StreamReader reader = new StreamReader(file);

        string text = reader.ReadToEnd();
        int c=0;

        MatchCollection matchList = exp.Matches(text);
        c = matchList.Count;

        Console.WriteLine("Reading " + file + " -> " + c + " matches");
      }
    }
  }
}

如果我注释掉这一行

c = matchList.Count;

它非常快。但我需要知道它找到的匹配数。

这是最快的方法吗?对于我拥有的文件组,解析每个文件需要 14 秒。 Perl 需要 1 秒才能输出完全相同的信息。

PS:每个文件(文本文件)的大小为 +/- 1Mb,因此处理时间约为 20Mb。

谢谢 ;)

【问题讨论】:

  • 为什么不继续使用 perl?
  • 如果你先将所有文件读入内存,然后做正则表达式呢?
  • Sean 我正在研究不同的技术来比较它们,我只是不明白为什么 c# 的性能如此糟糕。必须有办法改善这一点。 Phi 不适用于我接下来要做的事情(读取每秒非常快的单个文件,这意味着我不确定它们有多少)
  • 有趣。 Jeffrescue?

标签: c# regex performance file


【解决方案1】:

您可以使用 BackgroundWorker 来并行搜索文件。您必须跟踪计数并在最后汇总。每个文件或一组文件都可以有一个 BGWorker。 4.0 框架将简化此代码,因为它具有并行数据结构。

【讨论】:

  • -1: foosnazzy -- 添加代码示例(根据 stackoverflow 指南),我会给你+1。
  • 这听起来很可疑,就像你拿着他的 +1 来勒索赎金。将代码示例存放在桥东南侧的第 3 根柱子后面。一个人来。
【解决方案2】:

这里可能对您不利的一件事是您将文件连接保持打开状态,这会增加一些不必要的开销。

请务必在执行 ReadToEnd() 后致电 reader.Close();

【讨论】:

  • 我试过了,但没有什么不同;)还是谢谢
【解决方案3】:

使用

StreamReader reader = new StreamReader(file); 

很危险,它不会关闭你的文件句柄。

用途:

using(Streamreader reader = new StreamReader(file).

确保您的文件句柄已关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-13
    • 2016-05-14
    • 2012-07-30
    • 2020-05-21
    • 2023-03-23
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多