8

我最近一直在使用 PLINQ 来执行一些数据处理。

基本上我有大约 4000 个时间序列(基本上是 的实例Dictionary<DataTime,T>),我将它们存储在一个名为timeSeries.

要执行我的操作,我只需执行以下操作:

timeSeries.AsParallel().ForAll(x=>myOperation(x))

如果我看看我的不同内核发生了什么,我注意到首先,我所有的 CPU 都在使用中,我在控制台(我输出一些日志)上看到同时处理了几个时间序列。

但是,这个过程很长,大约 45 分钟后,日志清楚地表明只有一个线程在工作。这是为什么?

我试着考虑一下,我意识到从列表的开头和结尾的角度来看,它timeSeries包含更易于处理的实例。myOperation所以,我想知道 PLINQ 使用的算法是否包括将 4000 个实例拆分为 4 个核心,每个核心分配 1000 个。然后,当核心完成其工作分配时,它又回到空闲状态。这意味着其中一个核心可能面临更重的工作量。

我的理论是正确的还是有其他可能的解释?

我应该在运行之前对列表进行洗牌,还是可以使用某种并行参数来解决该问题?

4

1 回答 1

5

你的理论可能是正确的,尽管有一种叫做“偷工减料”的东西可以反驳这一点。我不确定为什么这在这里不起作用。外部末端有很多(>=几十个)大型工作还是只有几个?

除了改组您的数据之外,您还可以使用接受自定义 Partioner重载。这将使您更好地平衡工作。AsParallel()

旁注:对于这种情况Parallel.ForEach(),我更喜欢更多选项和更简洁的语法。

于 2013-07-25T08:15:59.217 回答