【问题标题】:Aggregate custom data from ParallelQuery从 ParallelQuery 聚合自定义数据
【发布时间】:2016-01-22 18:46:58
【问题描述】:

我正在从一些文件中解析很多单词(数百万)并按语言计算它们。我使用 PLINQ 是因为性能,但我认为(通过观看任务管理器),整个过程是按顺序进行的。可能被我的聚合函数阻止了。

这可能吗?

这里是有罪的 PLINQ

ParallelQuery<string> query = Directory.EnumerateFiles(test, "*.d", SearchOption.AllDirectories).AsParallel();
query = query.SelectMany(parseStrings).Where(isValidPhrase);
query = query.SelectMany(s => Regex.Matches(s, @"\w+").Cast<Match>().Select(match => match.Value));

Result output = query.Aggregate(new Result(), (result, word) =>
{
    if (word.All(russianAlfabet.Contains))
        result.Ru++;
    else if (czechWords.Contains(word))
        result.Cs++;
    else
        result.Other++;

    return result;
});

...这是一个聚合结果的类

class Result {
    public int Ru { get; set; }
    public int Cs { get; set; }
    public int Other { get; set; }
}

【问题讨论】:

    标签: c# aggregate plinq


    【解决方案1】:

    试试这个重载ParallelEnumerable.Aggregate

    public static TResult Aggregate<TSource, TAccumulate, TResult>(
        this ParallelQuery<TSource> source,
        TAccumulate seed,
        Func<TAccumulate, TSource, TAccumulate> updateAccumulatorFunc,
        Func<TAccumulate, TAccumulate, TAccumulate> combineAccumulatorsFunc,
        Func<TAccumulate, TResult> resultSelector
    )
    

    【讨论】:

      猜你喜欢
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-30
      • 2012-01-19
      相关资源
      最近更新 更多