【问题标题】:R Parallel processing ending prematurelyR并行处理提前结束
【发布时间】: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


【解决方案1】:

我认为这作为评论会更好,但我还没有声誉。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 2013-09-19
      相关资源
      最近更新 更多