2015-11-06 1 views
1

У меня есть ключевое слово 50000, которое применяется шаблон регулярного выражения. Мое приложение получает некоторый текстовый контент и пытается найти ключевые слова, которые являются математикой с этим контентом.Быстрый способ сопоставления текста с несколькими шаблонами регулярных выражений

Я делаю это как цикл по всем ключевым словам и поиск каждого из них в контенте.

Потому что слишком много контента для соответствия. Я готов найти лучший способ, если он существует.

Есть ли лучший способ сделать это?

Это пример код, я сейчас делаю:

List<string> keywords = getKeywords(); 
     string textToMatch = getNews(); 

     List<string> result = new List<string>(); 

     foreach (var keyword in keywords) 
     { 
      Match r = Regex.Match(textToMatch, keyword); 
      if(r.Success) 
       result.Add(keyword) 
     } 
+0

Я думаю, вам лучше спросить в разделе [Обзор кода] (http://codereview.stackexchange.com/). – Han

+0

@ Handoko.Chen nope. это не устраивает Code Review, потому что здесь нет кода, который нужно пересмотреть! –

+0

@ M.kazemAkhgary, я забыл сказать ему, что он должен предоставить код для проверки. – Han

ответ

0

Если мы думаем, что только один текст соответствует нескольким ключевым словам, нет совершенно другого способа работать. Мы можем просто использовать Parallel.For, скомпилированное регулярное выражение и т. Д.

В моем случае я получаю слишком много текстовых сообщений, чтобы они соответствовали ключевым словам. Предположим, у меня есть 50 текстовых и 50000 ключевых слов. Обычно я перехожу к циклу ключевых слов для каждого текста. Теперь, сначала я объединил весь текст в один большой текст. Затем запустите для этого матч. Список совпадающих ключевых слов будет возвращен. Наконец, повторите совпадение для каждого текста, но только для сопоставленного списка ключевых слов.

+1

Это не отвечает на вопрос. Я знаю, что вы отвечаете на свой вопрос, но, пожалуйста, добавьте более подробную информацию, чтобы другие могли извлечь выгоду, узнав, что вы сделали. – AdrianHHH

+0

@AdrianHHH благодарит вас за консультацию. Я добавил дополнительную информацию. Я могу сделать больше в соответствии с требованиями. – mavera

2

Прежде всего, вы можете использовать RegexOptions.Compiled, который инструктирует движок регулярных выражений для компиляции выражения регулярного выражения в IL, используя легкие генерации коды. Программа начнет замедляться, но совпадения с использованием регулярного выражения быстрее.

Следующим шагом будет некоторое приятное воплощение шаблона проектирования Consumer Producer. К сожалению, я не знаю, что это самый медленный в своих операциях, но если вы попытаетесь реализовать эту модель она должна быть быстрее (некоторые ниже псевдокод)

 BlockingCollection<string> collection = new BlockingCollection<string>(); 
     Action productionAction =() => 
     { 
      //produce data then 
      collection.Add(ProcessedData); 
     }; 
     Action consumentAction =() => 
     { 
      //consume data 
      var data = collection.Take(); 
      //then 
      //do your things 

     }; 
     Parallel.Invoke(productionAction,consumentAction); 
     // code will end here when everything will be processed 
     // also you can change Action to TaskRun to use some Multithreading 

Вы также можете попробовать простой способ, который может улучшить Performence существенным (или нет! Я не знаете остальной части вашего кода!), заменив ваш цикл на Parallel.ForEach

+0

Я попробовал все, что вы сказали здесь. Параллельные функции работают очень хорошо, но поскольку я уже работаю с несколькими потоками, и процессор уже настолько занят, он не получил никакой прибыли. – mavera

Смежные вопросы