我最近一直在使用PLINQ来执行一些数据处理。
基本上我有大约4000个时间序列(基本上是Dictionary<DataTime,T>
的实例),我在一个名为timeSeries
的列表中存储。
要执行我的操作,我只需:
timeSeries.AsParallel().ForAll(x=>myOperation(x))
如果我看看我的不同核心发生了什么,我注意到,首先,我的所有CPU都在使用,我在控制台上看到(我输出了一些日志),同时处理了几个时间序列时间。
然而,这个过程很漫长,大约45分钟后,日志记录清楚地表明只有一个线程在工作。那是为什么?
我试着想一想,我意识到timeSeries
包含的实例更简单,可以从列表的开头和结尾处myOperation
的角度进行处理。所以,我想知道PLINQ使用的算法是否可能包括将4个核心分成4000个实例,每个核心分配1000个核心。然后,当核心完成其工作分配后,它就会回到空闲状态。这意味着其中一个核心可能面临更大的工作量。
我的理论是否正确或是否有其他可能的解释?
在运行之前我应该将我的列表随机播放,还是可以使用某种并行参数来解决这个问题?
答案 0 :(得分:5)
你的理论可能是正确的,尽管有一种叫做'worktealing'的东西可以解决这个问题。我不确定为什么这不起作用。在外端还是只有少数几个(>几十个)大型工作?
除了随机播放您的数据外,您还可以AsParallel()
使用接受the overload的Parallel.ForEach()
。这样可以让你更好地平衡工作。
旁注:对于这种情况,我更喜欢{{1}},更多选项和更清晰的语法。