2014-11-20 57 views
0

我遇到了并行处理和R中的foreach函数的问题。我在运行我的foreach代码并监视进度之前立即注册了6个集群。我看到我的CPU几乎达到了70%(自从注册了所有6个内核以来,预计会达到100%),但是几秒钟后它就会下降,似乎正在完成单个内核的其余工作。我使用doMC软件包在我的linux机器上运行了相同的代码,在那里我获得了100%的CPU大约10秒,然后它在一个核心上减少并完成。这导致我相信问题是我写了我的代码。R并行处理过早结束

我有一个开始和结束纬度/经度列的位置数据集。我正在使用geophere包来计算每行的开始到结束的大圆路径,每行将数据集中的每个原始行扩展为12行,之后我将结果重新绑定到绘图的数据框中。

完成后,我的整个数据集应该大约为35M行,所以我真的想要利用多个内核。

library(foreach) 
library(doParallel) 

cl = makeCluster(6) 
registerDoParallel(cl) 

arc = foreach (i = temp$id, .combine = rbind, .packages = "geosphere") %dopar% { 
    data.frame(
    id = rep(temp[i, 9], 12), 
    supplier = rep(temp[i, 1], 12), 
    receiving_facility = rep(temp[i, 2], 12), 
    commodity = rep(temp[i, 3], 12), 
    weight = rep(temp[i, 4], 12), 
    time_period = rep(temp[i, 5], 12), 
    lat = gcIntermediate(p1 = c(temp$supp_lon[i], temp$supp_lat[i]), 
         p2 = c(temp$rec_lon[i], temp$rec_lat[i]), n = 10, 
         addStartEnd = TRUE)[,2], 
    lon = gcIntermediate(p1 = c(temp$supp_lon[i], temp$supp_lat[i]), 
         p2 = c(temp$rec_lon[i], temp$rec_lat[i]), n = 10, 
         addStartEnd = TRUE)[,1]) 
    } 
stopCluster(cl) 

enter image description here

+0

这可能是因为我们只是遵循不同的教程,但我使用doMC pakage中的'registerDoMC(numberOfCores)'来注册所需数量的教程。可能可以帮助 – OganM 2014-11-20 20:35:10

+0

doMC在Windows中不起作用,但是我在我的linux上使用并设置了相同的结果 – JestonBlu 2014-11-20 21:57:02

回答

2

我认为这将是一个更好的评论,但我没有为它的声誉呢。

据我的理解,从我的经验来看,它是按照预期工作的。并行运行代码。但是,行绑定功能(即将所有功能重新组合在一起)是在单个内核上完成的,这就是为什么您在最后看到额外的单核处理时间的原因。

-1

在不合并结果的情况下运行该过程。或者返回一个虚拟值,以便组合速度非常快。这样您可以确认单核是由于.combine还是由于代码问题。就你的代码而言,它看起来没问题,并行性按预期实现。