为什么我的Parallel.ForAll调用最终使用单个线程?

时间:2013-07-25 07:47:46

标签: c# .net plinq

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

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

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

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

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

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

我试着想一想,我意识到timeSeries包含的实例更简单,可以从列表的开头和结尾处myOperation的角度进行处理。所以,我想知道PLINQ使用的算法是否可能包括将4个核心分成4000个实例,每个核心分配1000个核心。然后,当核心完成其工作分配后,它就会回到空闲状态。这意味着其中一个核心可能面临更大的工作量。

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

在运行之前我应该​​将我的列表随机播放,还是可以使用某种并行参数来解决这个问题?

1 个答案:

答案 0 :(得分:5)

你的理论可能是正确的,尽管有一种叫做'worktealing'的东西可以解决这个问题。我不确定为什么这不起作用。在外端还是只有少数几个(>几十个)大型工作?

除了随机播放您的数据外,您还可以AsParallel()使用接受the overloadParallel.ForEach()。这样可以让你更好地平衡工作。

旁注:对于这种情况,我更喜欢{{1}},更多选项和更清晰的语法。