2012-12-19 105 views
5

我想優化搜索大文本文件(300-600mb)中的字符串。使用我目前的方法,它耗時太長。c#搜索大文本文件

目前我一直在使用IndexOf來搜索字符串,但所花費的時間太長(20s),以便爲每個包含字符串的行建立一個索引。

如何優化搜索速度?我試過Contains(),但那也很慢。有什麼建議麼?我想正則表達式匹配,但我沒有看到有顯着的速度提升。也許我的搜索邏輯是有缺陷的

例如

while ((line = myStream.ReadLine()) != null) 
{ 
    if (line.IndexOf(CompareString, StringComparison.OrdinalIgnoreCase) >= 0) 
    { 
     LineIndex.Add(CurrentPosition); 
     LinesCounted += 1; 
    } 
} 
+2

你在找什麼?話? – Lloyd

+1

什麼是您的CompareString ..請顯示您正在尋找的示例.. – MethodMan

+0

您確定這是搜索的部件?需要多長時間不做任何檢查,只需逐行讀取文件? –

回答

9

你使用執行蠻力算法O(nm)的時間,其中ñ是字符串的長度被搜索和m您試圖找到的子串/模式的長度。你需要使用一個字符串搜索算法

但是,使用小心製作的正則表達式可能是足夠的,這取決於你正在努力尋找。請參閱Jeffrey's Friedl的指示,Mastering Regular Expressions以獲取有關構建高效正則表達式(例如,不回溯)的幫助。

您可能還需要諮詢好算法文本。我(在算法[C | C++ | Java的])偏羅伯特·塞奇威克的Algorithms在其various incarnations

+0

感謝放緩下來,我會嘗試使用正則表達式搜索 - !如果實在是太慢了,我會考慮你上面 – user1747467

1

你看到這些問題(和答案)?

做它,你現在的方式似乎是,如果你想要做的是閱讀文本文件的路要走。其他的想法:

  • 如果能夠預先對數據進行排序,當它被插入的文本文件,例如,可以幫助。

  • 您可以將數據插入數據庫並根據需要進行查詢。

  • 你可以使用一個哈希表

1

您可以通過用戶regexp.Match(字符串)。正則表達式匹配速度更快。

靜態無效的主要()

{

string text = "One car red car blue car"; 
    string pat = @"(\w+)\s+(car)"; 

    // Instantiate the regular expression object. 
    Regex r = new Regex(pat, RegexOptions.IgnoreCase); 

    // Match the regular expression pattern against a text string. 
    Match m = r.Match(text); 
    int matchCount = 0; 
    while (m.Success) 
    { 
    Console.WriteLine("Match"+ (++matchCount)); 
    for (int i = 1; i <= 2; i++) 
    { 
     Group g = m.Groups[i]; 
     Console.WriteLine("Group"+i+"='" + g + "'"); 
     CaptureCollection cc = g.Captures; 
     for (int j = 0; j < cc.Count; j++) 
     { 
      Capture c = cc[j]; 
      System.Console.WriteLine("Capture"+j+"='" + c + "', Position="+c.Index); 
     } 
    } 
    m = m.NextMatch(); 
    } 

}

2

不幸的是,我不認爲有一大堆,你可以直接在C#做的。

我已經找到了博耶 - 穆爾算法成爲這個任務的速度極快。但是我發現沒有辦法做到這一點,就像IndexOf一樣快。我的假設是,這是因爲IndexOf在手工優化的彙編器中實現,而我的代碼在C#中運行。

你可以看到這篇文章Fast Text Search with Boyer-Moore在我的代碼和性能測試結果。

+0

HM列出的不同的搜索交易算法,所以你建議的IndexOf是最快的方法,我可以搜索一個簡單的字符串?到目前爲止使用這種方法已增加我的文件閱讀到30秒左右。我想我會看看是否有任何替代方案來提高搜索速度... – user1747467

+0

是的,如果喲你的搜索是區分大小寫和文化敏感的。否則,考慮因素會改變。 –

+0

不,我的搜索不區分大小寫,也不區分對文化敏感。簡單的字符串文本搜索,想知道如果IndexOf是可以在c#中執行此任務的最快速 - 如果是 - 那麼我需要更改我的設計並選擇另一個平臺 – user1747467