Как вы можете сделать соответствие регулярных выражений более эффективным? - PullRequest
0 голосов
/ 20 июня 2019

Я анализирую большие файлы журнала с помощью Regex для извлечения соответствующих данных.Время выполнения моего синтаксического анализатора увеличивается экспоненциально с размером файла.Когда я использую профилировщик Visual Studio, он показывает, что большую часть времени тратит на выполнение функции Regex.Match.Как я могу сделать свои шаблоны Regex более эффективными?Есть ли более эффективная альтернатива Regex?

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

ЭтоВот шаблоны, которые я в настоящее время сопоставляю со строками:

cmdStartPattern = new Regex(@"(\d+.\d+):\s+ufshcd_command:\s+(\w+).ufshc:\s+(\w+)_send:\s+tag:\s+(\d+)\s+cmd:\s+(\w+)\s+lba:\s+(\d+)\s+size:\s+(\d+)\s+DB:\s+(\w+)", RegexOptions.Compiled);
cmdDonePattern = new Regex(@"(\d+.\d+):\s+ufshcd_command:\s+(\w+).ufshc:\s+(\w+)_cmpl_*\d*:\s+tag:\s+(\d+)\s+cmd:\s+(\w+)\s+lba:\s+(\d+)\s+size:\s+(\d+)", RegexOptions.Compiled);
cmdBlockPattern = new Regex(@"(\d+.\d+):\s+block_rq_issue:\s+(\d+),(\d+)\s+(\w+)\s+\d+\s+\((.*)\)\s+(\d+)\s+\+\s+(\d+)", RegexOptions.Compiled);
getCurrTimePattern = new Regex(@"(\d+.\d+):", RegexOptions.Compiled);

Это примеры строк в файлах журналов, из которых я пытаюсь извлечь данные:

          <idle>-0     [001] d.h2 228795.291923: ufshcd_command: 1d84000.ufshc:      scsi_cmpl: tag: 0  cmd: 0x2a lba: 19733048  size: 4096    DB: 0x0        IS: 0x0
          <idle>-0     [001] d.h2 228795.291928: ufshcd_clk_gating: 1d84000.ufshc: state changed to REQ_CLKS_OFF
          <idle>-0     [001] ..s1 228795.291950: block_rq_complete: 8,0 WAS () 19733048 + 8 [0]
              sh-7199  [002] d..1 228795.318053: block_rq_issue: 8,0 RA 0 () 19692680 + 8 [sh]
              sh-7199  [002] d..1 228795.318088: ufshcd_clk_gating: 1d84000.ufshc: state changed to CLKS_ON
              sh-7199  [002] d..1 228795.318149: ufshcd_command: 1d84000.ufshc:      scsi_send: tag: 0  cmd: 0x28 lba: 19692680  size: 4096    DB: 0x1        IS: 0x0
          <idle>-0     [001] d.h2 228795.318822: ufshcd_command: 1d84000.ufshc:      scsi_cmpl: tag: 0  cmd: 0x28 lba: 19692680  size: 4096    DB: 0x0        IS: 0x0
          <idle>-0     [001] d.h2 228795.318836: ufshcd_clk_gating: 1d84000.ufshc: state changed to REQ_CLKS_OFF 

Как выЯ вижу, что есть строки, которые мне не нужны, и начало каждой строки перед десятичным числом является переменным, поэтому я не могу включить это в свои шаблоны Regex.

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