【发布时间】:2011-10-31 10:58:37
【问题描述】:
我有一个包含数千个对象的列表,对其执行可能需要 1 到 3 分钟的操作。 我当然在使用 PLINQ,但我注意到当接近输入列表的末尾时,只有一个内核在工作,就像事先确定了分区一样。
那么,对于 IList,只要有要处理的项目,强制 PLINQ 继续使用工作线程的最佳方法是什么? 该计算机有大量可用的硬件内核。
参考资料:
【问题讨论】:
标签: c# .net linq plinq parallel-processing
我有一个包含数千个对象的列表,对其执行可能需要 1 到 3 分钟的操作。 我当然在使用 PLINQ,但我注意到当接近输入列表的末尾时,只有一个内核在工作,就像事先确定了分区一样。
那么,对于 IList,只要有要处理的项目,强制 PLINQ 继续使用工作线程的最佳方法是什么? 该计算机有大量可用的硬件内核。
参考资料:
【问题讨论】:
标签: c# .net linq plinq parallel-processing
据我了解,PLINQ 将根据源序列是否为IList 来选择范围或块分区。如果它是IList,则边界是已知的,并且可以通过索引访问元素,因此 PLINQ 选择范围分区来在线程之间平均划分列表。例如,如果您的列表中有 1000 个项目并且使用 4 个线程,则每个线程将有 250 个项目要处理。另一方面,如果源序列不是IList,PLINQ 不能使用范围分区,因为它不知道范围是什么;所以它使用块分区代替。
在你的情况下,如果你有一个IList 并且你想强制进行块分区,你可以让它看起来像一个简单的IEnumerable:而不是这样写:
list.AsParallel()...
这样写:
list.Select(x => x).AsParallel()...
虚拟投影将隐藏源实际上是 IList 的事实,因此 PLINQ 将使用块分区。
【讨论】: