2016-01-21 58 views
-1

我的應用程序正在解析不斷傳入的跟蹤。
我在外部庫中預編譯正則表達式。 讀取和分析輸入數據是在以下函數中完成的,該函數在工作線程中運行。

爲了演示目的,我已經精簡了代碼。目前它使用30個不同的正則表達式,它們被順序檢查。解析跟蹤數據的最佳做法

private void Filter() 
    { 
     Regex rgx_1 = new RegEx_1(); 
     Regex rgx_2 = new RegEx_2(); 
     ... 
     Regex rgx_N = new RegEx_N(); 

     uint index = 0; 
     while (!FilterThread.CancellationPending) 
     { 
      BufferLength = (int)Source.GetItemCount() - 1; 
      if (index <= BufferLength) 
      { 
       item = (ColorItem)Source.GetItem(index); 
       if (item != null) 
       { 
        tracecontend = item.GetItemSummary(); 
        if (rgx_1.IsMatch(tracecontend)) 
        { 
         current_trace = new TraceLine(index, tracecontend, GROUP_1); 
        } 
        else if (rgx_2.IsMatch(tracecontend)) 
        { 
         current_trace = new TraceLine(index, tracecontend, GROUP_2); 
        } 
        else if (rgx_3.IsMatch(tracecontend)) 
        { 
         current_trace = new TraceLine(index, tracecontend, GROUP_3); 
        } 
        ... 
        else if (rgx_N.IsMatch(tracecontend)) 
        { 
         current_trace = new TraceLine(index, tracecontend, GROUP_N); 
        } 
        listBox.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new AddTraceDelegate(AddTrace), current_trace); 
       } 
       index++; 
       System.Threading.Thread.Sleep(1); 
      } 
     } 
    } 

通過這種方法,我可以每秒處理多達500條曲線,這對於實時跟蹤而言是足夠的。但是讀取包含高達2.000.000個痕跡的文件仍然需要相當長的時間。

你有什麼想法如何加快執行和提高吞吐量?

有沒有人有這種情況下的最佳做法?

編輯: 這裏是一個正則表達式

  compilationList.Add(new RegexCompilationInfo(@"SomeTextToFilterFor(.*?)", 
        RegexOptions.IgnoreCase | RegexOptions.CultureInvariant, 
        "RegEx_1", 
        "Utilities.RegularExpressions", 
        true)); 
      RegexCompilationInfo[] compilationArray = new RegexCompilationInfo[compilationList.Count]; 
      AssemblyName assemName = new AssemblyName("RegexLib, Version=1.0.0.1001, Culture=neutral, PublicKeyToken=null"); 
      compilationList.CopyTo(compilationArray); 
      Regex.CompileToAssembly(compilationArray, assemName); 
+0

這看起來像[*優化性能與多個調用Regex.IsMatch在大型文本*](http://stackoverflow.com/questions/31432630/optimize-performance-with-multiple-calls-to-正則表達式-ismatch-上大文/ 31432829#31432829)。重點是:1)你使用有效的正則表達式嗎? 2)你用'RegexOptions.Compiled'聲明它們是私有靜態只讀字段嗎? (我猜不是通過查看問題)。 –

+0

'tracecontend'的平均長度是多少? –

+0

我相信你有'。*'和'。*?'的正則表達式。審查他們的效率。如果使用正則表達式解析HTML,請重新考慮該方法。 –

回答

1

的例子有很多方法可以提高速度的數字。

結合您的正則表達式,如果可能的

正則表達式是具有可能性回溯但會嘗試做所有的工作一氣呵成狀態機。比許多比賽電話要好一點。

例如這樣的:

aaaaaab | aaaaaac 

比這更慢:

aaaaaa(b|c) 

,當然,如果你分開運行要慢得多。

優化正則表達式本身

您可以使用使用RegexBuddy爲這些目的。只需鍵入一些模式和來源,你就會看到所有回溯和耗時的正則表達式部分。您可以更改模式的結構,或者在您的正則表達式中添加if子句以阻止回溯。

例如,當你知道圖案的某些部分只能在一些ocasions匹配可以過濾情況:

(?(?=/*fast to check condition*/)/*complex regex here*/|/*simple regex here*/) 

預編譯模式扔出來的局部範圍爲全局範圍(使其靜態)和添加RegexOptions.Compiled選項。

+0

正確:太廣泛的問題的答案太廣泛。 –

+0

合併RegExes不起作用,因爲實際內容安靜不同,我想將每個匹配鏈接到某個組。 – thowa

相關問題