【发布时间】:2014-11-20 20:07:49
【问题描述】:
我在 R 中遇到了并行处理和 foreach 函数的问题。我在运行我的 foreach 代码并监控进度之前立即注册了 6 个集群。我最初看到我的 CPU 飙升至 70%(自注册所有 6 个内核以来预期为 100%),但几秒钟后它会下降,并且似乎正在完成单个内核上的其余工作。我使用 doMC 包在我的 linux 机器上运行了相同的代码,我在大约 10 秒内获得 100% 的 cpu,然后它减少并在一个核心上完成。这让我相信问题在于我是如何编写代码的。
我有一个位置数据集,其中包含开始和结束纬度/经度列。我正在使用 geophere 包为每一行计算一个从头到尾的大循环路径,它将数据集中的每个原始行扩展到 12 行,之后我将结果重新绑定到数据框中进行绘图。
我的整个数据集在完成后应该有大约 3500 万行,所以我真的很想利用多核。
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)
【问题讨论】:
-
这可能是因为我们只是遵循不同的教程,但我使用 doMC 包中的
registerDoMC(numberOfCores)来注册所需数量的教程。可能会有所帮助 -
doMC 在 Windows 中不起作用,但我在我的 linux 设置上使用并得到了相同的结果
标签: r