c# - 并行聚合集合

标签 c# parallel-processing aggregate parallel.foreach

我看过基本类型的并行聚合代码,例如

Parallel.For<int>(0, result.Count, () => 0, (i, loop, subtotal) =>
    {
        subtotal += result[i];
        return subtotal;
    },
    (x) => Interlocked.Add(ref sum, x)
);

我想知道是否有列表/其他集合的等价物,例如:

List<Result> AllResults;
Parallel.ForEach(allIDs, (currentID) =>
{

    subList.add(GetResultFor(currentID));
    return subList;
},
(x) =>
{
    lock(AllResults)
        AllResults.AddRange(subList);
};

我猜没有什么比这更漂亮和整洁的了,但我想不出另一种方法,当然不是通过标准的 parralel.ForEach 因为我想不出你会怎么说“这个核心有这个范围,这个核心这个范围”......

最佳答案

我认为在这两个例子中,PLINQ可以更好地为您服务,并且在使用非线程安全集合时无需手动锁定。

您的求和计算可以转换为:

var sum = result.AsParallel().Sum();

第二个例子是 List<T>可以转换为:

List<Result> results = allIDs.AsParallel()
                             .Select(id => GetResultFor(id))
                             .ToList();

注意并行性仅与测试所说的一样好。并行并不总是会加速您的代码,有时它甚至可能会降低顺序循环的性能。

关于c# - 并行聚合集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33613163/

相关文章:

r - 如何使用 Torque/MOAB 调度程序设置 doSNOW 和 SOCK 集群?

java - Java 中的并行和事务处理 (Java EE)

R - reshape 数据框和聚合元素

c# - MVC 4 - 更改密码错误 : "Index (zero based) must be greater than or equal to zero..."

java - 在 Hadoop 中映射和减少类属性

r - 按 R 中的列名组聚合矩阵(或 data.frame)

聚合查询会在 Blazegraph 上导致错误,但在 Sesame 上不会导致错误

c# - SignalR disconnect 在互联网断开/重新连接时未被调用

c# - $(this) 在 C# 中等效

c# - Xamarin Android 客户端将 JSON 发布到 Node JS Web 服务