Какой самый быстрый способ в C # найти шаблон в группе файлов? - PullRequest
1 голос
/ 02 апреля 2009
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: каждый файл (текстовый файл) имеет +/- 1 МБ, поэтому для обработки требуется ~ 20 МБ.

Спасибо;)

Ответы [ 3 ]

2 голосов
/ 02 апреля 2009

Вы можете использовать BackgroundWorker для распараллеливания поиска файлов. Вам нужно будет отслеживать количество и объединять его в конце. Вы можете иметь BGWorker для каждого файла или группы файлов. 4.0 Framework облегчит этот код, поскольку он имеет параллельные структуры данных.

0 голосов
/ 04 апреля 2009

Использование

StreamReader reader = new StreamReader(file); 

опасно, он не закрывает ваш дескриптор файла.

Использование:

using(Streamreader reader = new StreamReader(file).

чтобы убедиться, что ваши файловые дескрипторы закрыты.

0 голосов
/ 02 апреля 2009

Одна вещь, которая может сработать против вас, это то, что вы оставляете свои файловые соединения открытыми, что добавляет некоторые ненужные накладные расходы.

Обязательно вызовите reader.Close(); после выполнения ReadToEnd ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...