【问题标题】:With PLINQ, how can I set the preferred chunk size when using AsParallel().MaxDegreeOfParallelism(4)?使用 PLINQ,如何在使用 AsParallel().MaxDegreeOfParallelism(4) 时设置首选块大小?
【发布时间】:2011-10-31 10:58:37
【问题描述】:

我有一个包含数千个对象的列表,对其执行可能需要 1 到 3 分钟的操作。 我当然在使用 PLINQ,但我注意到当接近输入列表的末尾时,只有一个内核在工作,就像事先确定了分区一样。

那么,对于 IList,只要有要处理的项目,强制 PLINQ 继续使用工作线程的最佳方法是什么? 该计算机有大量可用的硬件内核。

参考资料:

【问题讨论】:

    标签: c# .net linq plinq parallel-processing


    【解决方案1】:

    据我了解,PLINQ 将根据源序列是否为IList 来选择范围或块分区。如果它是IList,则边界是已知的,并且可以通过索引访问元素,因此 PLINQ 选择范围分区来在线程之间平均划分列表。例如,如果您的列表中有 1000 个项目并且使用 4 个线程,则每个线程将有 250 个项目要处理。另一方面,如果源序列不是IList,PLINQ 不能使用范围分区,因为它不知道范围是什么;所以它使用块分区代替。

    在你的情况下,如果你有一个IList 并且你想强制进行块分区,你可以让它看起来像一个简单的IEnumerable:而不是这样写:

    list.AsParallel()...
    

    这样写:

    list.Select(x => x).AsParallel()...
    

    虚拟投影将隐藏源实际上是 IList 的事实,因此 PLINQ 将使用块分区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      相关资源
      最近更新 更多