C# 用于拆分文档中单词的可扩展解决方案?

C# 用于拆分文档中单词的可扩展解决方案?,c#,.net,string,parsing,search-engine,C#,.net,String,Parsing,Search Engine,我有一个文档,文档中的单词用空格分隔和提取。为此,我使用了以下代码 string[] words = s.Split(' '); 现在的问题是,我将把这段代码用于搜索引擎的解析器。正因为如此,如果不是数百万个网页,也会有几十万个网页需要拆分成文字 我担心使用上述代码的过程可能需要很长时间,还是毫无根据。如果它是正确的,任何关于替代可扩展解决方案的建议都将受到欢迎。编写您自己的实现,返回一个推迟执行的IEnumerable。例如: private static IEnumerable<st

我有一个文档,文档中的单词用空格分隔和提取。为此,我使用了以下代码

string[] words = s.Split(' ');
现在的问题是,我将把这段代码用于搜索引擎的解析器。正因为如此,如果不是数百万个网页,也会有几十万个网页需要拆分成文字


我担心使用上述代码的过程可能需要很长时间,还是毫无根据。如果它是正确的,任何关于替代可扩展解决方案的建议都将受到欢迎。

编写您自己的实现,返回一个推迟执行的IEnumerable。例如:

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);
}

您可以枚举返回的可枚举项,而不是一次性拆分字符串并返回包含每个子字符串的数组(这将消耗大量内存),然后字符串将被动态拆分为多个片段。假设在每次迭代后不保留枚举字符串对象,它们将立即符合垃圾收集的条件。

您应该手动进行拆分。这里有一个搜索词是标记化,在空间上拆分并不是你想要的。因为这是一个性能问题,所以无法回答它是否毫无根据,因为您没有对结果的速度/可伸缩性设定任何期望-您必须首先设定目标,然后根据现有数据衡量解决方案。如果不进行任何测量,我猜与内容加载相比,即使使用相关GC,拆分的成本也不会明显。@AlexeiLevenkov你是对的,我应该提出一些定量标准。无论如何,因为我不知道搜索引擎标记化通常需要多长时间,所以我真的不能给出一个标准。我想我会继续使用string.split,稍后再报告。这是一个好看的代码。。。但我会非常惊讶它在OP案例中会有什么不同——看看任何HTML页面的源代码——几乎没有长字符串,而是有很多HTML标记需要用类似HtmlAgilityPack的东西适当剥离…@AlexeiLevenkov,即使在这种情况下,在处理大型文档时,内存占用将显著减少-即使文档的一半以上作为一个可枚举元素返回,这仍然减少了任何时刻所需的内存,并且减少了GC的压力。考虑内存消耗:在最坏的情况下,它不会比String.Split更糟糕,在最好的情况下,它会更好。