我有一個文檔,其中的單詞是由空格分隔和提取的。爲此,我使用了下面的代碼。在文檔中拆分單詞的可擴展解決方案?
string[] words = s.Split(' ');
現在的問題是,我打算將這段代碼用於搜索引擎的解析器。因此,如果不是數百萬的網頁,將會有成千上萬的網頁需要拆分成單詞。
我擔心使用上述代碼的過程可能需要很長時間,或者是沒有根據的。如果它是正確的,那麼對可選的可擴展解決方案的任何建議都會受到歡迎
我有一個文檔,其中的單詞是由空格分隔和提取的。爲此,我使用了下面的代碼。在文檔中拆分單詞的可擴展解決方案?
string[] words = s.Split(' ');
現在的問題是,我打算將這段代碼用於搜索引擎的解析器。因此,如果不是數百萬的網頁,將會有成千上萬的網頁需要拆分成單詞。
我擔心使用上述代碼的過程可能需要很長時間,或者是沒有根據的。如果它是正確的,那麼對可選的可擴展解決方案的任何建議都會受到歡迎
編寫自己的實現,返回延遲執行的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);
}
而是分裂的字符串中的一個鏡頭,並返回每一個子字符串數組(這將消耗大量的內存),你可以枚舉返回的枚舉和字符串會即時分解成碎片。假設您在每次迭代後都不保留枚舉的字符串對象,它們將立即符合垃圾回收的條件。
這是很好看的代碼......但我會非常驚訝,它會使OP的情況有所不同 - 看看任何HTML頁面的源代碼 - 幾乎沒有任何長字符串,而是需要很多HTML標記用HtmlAgilityPack之類的東西去掉...... –
@AlexeiLevenkov即使在這種情況下,處理大文檔時內存佔用量將會明顯縮小 - 即使超過一半的文檔作爲一個可枚舉元素返回,仍然少於在任何時刻都需要內存,並且GC上的壓力較小。考慮到內存消耗:在最壞的情況下,它不會比'String.Split()'差,並且在最好的情況下,它會顯着更好。 – cdhowie
您應該手動進行分割。這裏是一個[相關的問題/答案](http://stackoverflow.com/a/13817561/2316200) –
搜索項是「標記化」(並且在空間上拆分並不是必須的)。既然它是性能問題,就沒有辦法回答「這是沒有根據的」,因爲你對於結果的快速/可擴展性沒有設定任何期望 - 你必須首先設定目標,然後衡量你所擁有數據的解決方案。沒有任何測量,我猜測'Split'(甚至是相關的GC)的成本與加載內容相比並不明顯。 –
@AlexeiLevenkov你說得對,我應該提出一些量化標準。無論如何,因爲我真的不知道多久它通常需要爲搜索引擎進行標記化,我真的無法給出一個標準。我想我會繼續使用string.split()並稍後再報告。 –