2013-08-23 48 views
1

我有一個文檔,其中的單詞是由空格分隔和提取的。爲此,我使用了下面的代碼。在文檔中拆分單詞的可擴展解決方案?

string[] words = s.Split(' '); 

現在的問題是,我打算將這段代碼用於搜索引擎的解析器。因此,如果不是數百萬的網頁,將會有成千上萬的網頁需要拆分成單詞。

我擔心使用上述代碼的過程可能需要很長時間,或者是沒有根據的。如果它是正確的,那麼對可選的可擴展解決方案的任何建議都會受到歡迎

+0

您應該手動進行分割。這裏是一個[相關的問題/答案](http://stackoverflow.com/a/13817561/2316200) –

+0

搜索項是「標記化」(並且在空間上拆分並不是必須的)。既然它是性能問題,就沒有辦法回答「這是沒有根據的」,因爲你對於結果的快速/可擴展性沒有設定任何期望 - 你必須首先設定目標,然後衡量你所擁有數據的解決方案。沒有任何測量,我猜測'Split'(甚至是相關的GC)的成本與加載內容相比並不明顯。 –

+0

@AlexeiLevenkov你說得對,我應該提出一些量化標準。無論如何,因爲我真的不知道多久它通常需要爲搜索引擎進行標記化,我真的無法給出一個標準。我想我會繼續使用string.split()並稍後再報告。 –

回答

0

編寫自己的實現,返回延遲執行的IEnumerable<string>。例如:

private static IEnumerable<string> CreateSplitDeferredEnumerable(
    string str, 
    char delimiter) 
{ 
    var buffer = new StringBuilder(); 

    foreach (var ch in str) { 
     if (ch == delimiter) { 
      yield return buffer.ToString(); 
      buffer.Length = 0; 
     } else { 
      buffer.Append(ch); 
     } 
    } 

    if (buffer.Length != 0) { 
     yield return buffer.ToString(); 
    } 
} 

public static IEnumerable<string> SplitDeferred(this string self, char delimiter) 
{ 
    if (self == null) { throw new ArgumentNullException("self"); } 

    return CreateSplitDeferredEnumerable(self, delimiter); 
} 

而是分裂的字符串中的一個鏡頭,並返回每一個子字符串數組(這將消耗大量的內存),你可以枚舉返回的枚舉和字符串會即時分解成碎片。假設您在每次迭代後都不保留枚舉的字符串對象,它們將立即符合垃圾回收的條件。

+0

這是很好看的代碼......但我會非常驚訝,它會使OP的情況有所不同 - 看看任何HTML頁面的源代碼 - 幾乎沒有任何長字符串,而是需要很多HTML標記用HtmlAgilityPack之類的東西去掉...... –

+0

@AlexeiLevenkov即使在這種情況下,處理大文檔時內存佔用量將會明顯縮小 - 即使超過一半的文檔作爲一個可枚舉元素返回,仍然少於在任何時刻都需要內存,並且GC上的壓力較小。考慮到內存消耗:在最壞的情況下,它不會比'String.Split()'差,並且在最好的情況下,它會顯着更好。 – cdhowie

相關問題