你所描述的问题应该不涉及到搜索子串。将你的源文件分成多行(或者逐行读取),你已经知道每行都包含一个URL,并通过一些函数运行它来提取域名,然后将它与某些目标域的快速访问计数器进行比较如Dictionary<string, int>
,递增,当您去,如:
var source = Enumerable.Range(0, 300000).Select(x => Guid.NewGuid().ToString()).Select(x => x.Substring(0, 4) + ".com/" + x.Substring(4, 10));
var targets = Enumerable.Range(0, 900).Select(x => Guid.NewGuid().ToString().Substring(0, 4) + ".com").Distinct();
var tally = targets.ToDictionary(x => x, x => 0);
Func<string, string> naiveDomainExtractor = x=> x.Split('/')[0];
foreach(var line in source)
{
var domain = naiveDomainExtractor(line);
if(tally.ContainsKey(domain)) tally[domain]++;
}
...这需要我不是特别迅速的机器上的第二个三分之一,包括代测试数据。
无可否认,您的域提取器可能更复杂一些,但它可能不会占用大量处理器,并且如果您拥有多个内核,则可以使用ConcurrentDictionary<string, int>
和Parallel.ForEach
进一步提高速度。
向我们展示你当前的代码。 –
这是一个简单的并行化候选者 - 你看过Parallel.For还是类似的? –
另外,你只是要搜索主机名?如果是这样,有一种方法可以加快速度。 –