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