1

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

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

参考:

4

1 回答 1

2

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

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

list.AsParallel()...

写:

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

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

于 2011-10-31T02:58:37.893 回答