2010-02-15 82 views
3

我目前正在迭代7000到10000個文本定義,大小在0到5000個字符之間變化,我想檢查某個字符串是否存在於他們。我想在5000個不同的字符串定義區域中的某處進行此操作。檢查大量文件中是否存在字符串的最快方法

在大多數情況下,我只是想知道一個確切的不區分大小寫的匹配,但有時需要更正確地使用正則表達式。我想知道,當不需要正則表達式時,是否會更快地使用另一種「搜索」技術。

代碼的瘦身版本看起來像這樣。

foreach (string find in stringsiWantToFind) 
{ 
    Regex rx = new Regex(find, RegexOptions.IgnoreCase); 
    foreach (String s in listOfText) 
     if (rx.IsMatch(s)) 
      find.FoundIn(s); 
} 

我已經讀了一下,看看我是否缺少任何明顯的東西。有很多關於使用Compliled正則表達式的建議,但是我不明白這對於正則表達式的「動態」性質是有幫助的。

我還在CodeProject上閱讀了一個有趣的article,所以我只是想看看使用「FastIndexOf」來了解它在性能上的比較。

我只是想知道是否有人對此類問題有任何建議,以及性能如何優化?

感謝

+0

「編譯」版本將用於每個比較。如果你有10,000個文件(不清楚你的問題),它將被編譯一個並重新使用10K次而不是解釋10K次。 真的建議您將文本索引留給您購買的包。 – 2010-02-15 18:48:00

+0

如果搜索字詞在運行時間之前不知道,該如何編譯? – MrEdmundo 2010-02-15 18:52:43

+0

在這裏使用正則表達式是一個好主意,因爲.Net實現將使用Boyer-Moore搜索算法處理比IndexOf()快得多的簡單情況。 – Gabe 2010-02-15 19:05:59

回答

0

我會去了解一下像MS Indexing ServiceGoogle Desktop Search文件索引服務。這些API將允許您搜索文件的索引而不是文件本身,速度非常快。即來到我的腦海

+0

什麼定義了文本列表是從許多不同的來源定義的。因此,例如在某些情況下,它是從文件中獲取的,而在其他情況下是從數據庫中的字段中獲取的 – MrEdmundo 2010-02-15 18:41:46

+0

您可以將索引服務與全文SQL查詢結合使用嗎? – 2010-02-15 18:45:26

+0

我想我可以做的是。代碼目前運行約15分鐘,所以原則上我不打算改變它的結構。我主要是在尋找現有結構的小型變速箱,這可能會使性能提高很多分鐘。 – MrEdmundo 2010-02-15 18:48:17

-1

一個訣竅是:

在連接字符串成1大單,對全球範圍內正則表達式的工作。那會使用1個正則表達式產生一個字符串的結果,而不是循環遍歷你的列表。

希望這會有所幫助,

+0

我可能應該在我的例子中更具體(我會改變它)。我需要知道哪些「來源」文本被發現。 – MrEdmundo 2010-02-15 18:42:47

1

這樣的事情?創建一個正則表達式,其中包含要匹配的所有字符串,然後使用該正則表達式對文件進行循環。 new Regex參數是錯誤的,我對.net正則表達式模式的瞭解並不是最好的。我也遺漏了幾個using,使它在這裏更具可讀性。如果這可以改善事情,你可以編譯Regex

Regex rx = new Regex("string1|string2|string3|string5|string-etc", RegexOptions.IgnoreCase); 

foreach (string fileName in fileNames) 
{ 
    var fs = new FileStream(fileName.ToString(), FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);  
    var sr = new StreamReader(fs);  
    var sw = new StreamWriter(fs); 

    string readFile = sr.ReadToEnd(); 
    MatchCollection matches = rx.Matches(readFile); 

    foreach (Match match in matches) 
    { 
    //do stuff 
    } 
} 
+0

謝謝。正在考慮這是否是一個好主意,所以會放棄它。 – MrEdmundo 2010-02-15 21:51:05

+1

剛做了一個快速測試,看起來上述方法沒有性能改進。 – MrEdmundo 2010-02-15 22:32:18

+0

在我們看到示例代碼之前,示例似乎已經將文件加載到內存中,我的版本正在將它們加載到循環中,您是否考慮過這些問題? – gingerbreadboy 2010-02-15 23:07:04

相關問題