我最近一直在使用 PLINQ 来执行一些数据处理。
基本上我有大约 4000 个时间序列(基本上是 的实例Dictionary<DataTime,T>
),我将它们存储在一个名为timeSeries
.
要执行我的操作,我只需执行以下操作:
timeSeries.AsParallel().ForAll(x=>myOperation(x))
如果我看看我的不同内核发生了什么,我注意到首先,我所有的 CPU 都在使用中,我在控制台(我输出一些日志)上看到同时处理了几个时间序列。
但是,这个过程很长,大约 45 分钟后,日志清楚地表明只有一个线程在工作。这是为什么?
我试着考虑一下,我意识到从列表的开头和结尾的角度来看,它timeSeries
包含更易于处理的实例。myOperation
所以,我想知道 PLINQ 使用的算法是否包括将 4000 个实例拆分为 4 个核心,每个核心分配 1000 个。然后,当核心完成其工作分配时,它又回到空闲状态。这意味着其中一个核心可能面临更重的工作量。
我的理论是正确的还是有其他可能的解释?
我应该在运行之前对列表进行洗牌,还是可以使用某种并行参数来解决该问题?