我有一个html文档,想要针对多个(1 - 10k)[目前1k,后来高达10k]关键字的余额进行过滤。
我有一个预编译的正则表达式,它存储我的搜索结果,如:
static Regex r = new Regex(@"keyword1|keyword2|keyword999",RegexOptions.Compiled | RegexOptions.IgnoreCase);
这是我的代码:
Stopwatch sw = new Stopwatch();
sw.Start();
MatchCollection matches = Cache.r.Matches(doc.DocumentNode.InnerHtml);
string s = "";
if (matches.Count > 0)
{
foreach (Match m in matches)
{
s += m.Value + ",";
}
}
long time = sw.ElapsedMilliseconds;
Console.Write(time + " = "+matches.Count+" -> "+s );
平均时间大约需要5-8秒。这太过分了。 有没有有效的方法来过滤大量关键字的HTML文档? 或者也许有更有效的算法来过滤这个......
答案 0 :(得分:2)
您应该使用StringBuilder
代替string
..
除非您告诉我们关于关键字的更多信息,否则几乎没有任何优化。
答案 1 :(得分:2)
lboshuizen 指出
使用10k关键字创建正则表达式似乎不是[...]
的方法
如果您能负担产生多个线程,您可以并行扫描文档以发现关键字:
IEnumerable<string> keywords = LoadKeywords();
List<string> list = new List<string>();
keywords.AsParallel()
.Aggregate(list, (seed, keyword) =>
{
if(doc.DocumentNode.InnerHtml.Contains(keyword))
seed.Add(keyword);
return seed;
});
答案 2 :(得分:2)
有些答案已经很好了,但我想我也会把它扔进去......
我做了同样的事情,我使用HTML Agility Pack来帮助减少我为关键字分析的内容。
http://htmlagilitypack.codeplex.com/
获取HTML片段非常容易,只搜索文本节点,然后在该空间而不是整个文档上运行关键字分析。
它还有助于摆脱误报(javascript评论中出现的关键字,alt标签,等等)。
尝试减少搜索空间。
答案 3 :(得分:1)
建议:
使用10k关键字创建正则表达式似乎不是我的POV的方法。正则表达式是贪婪的,将尝试所有类型的冗余匹配。 (=浪费时间)
使用较小的关键字集构建正则表达式,并在html文档中逐步运行它们。
优化可以是从文档中删除匹配的关键字(和相关内容),将缩小,剩下的正则表达式要少得多=运行得更快。
或者
转过来,不要使用正则表达式再次扫描文档。 将文档分解为单词并再次检查字典。我怀疑该文件将包含所有10k字。 (从最小集合循环比从最大集合循环更有效)