【问题标题】:Using foreach instead of for loop使用 foreach 代替 for 循环
【发布时间】:2018-02-14 15:43:23
【问题描述】:

我正在尝试学习 foreach 来并行化我的任务

我的 for 循环如下所示:

     # create an empty matrix to store results
     mat <- matrix(-9999, nrow = unique(dat$mun), ncol = 2)

     for(mun in unique(dat$mun)) {

           dat <- read.csv(paste0("data",mun,".csv")
           tot.dat <- sum(dat$x)
           mat[mat[,1]== mun,2] <- tot.dat
     }

unique(dat$mun) 的长度为 5563。

我想使用foreach 来并行化我的任务。

      library(foreach)
      library(doParallel)

      # number of iterations
      iters <- 5563

      foreach(icount(iters)) %dopar% {
          mun <- unique(dat$mun)[mun] # this is where I cannot figure out how to assing mun so that it read the data for mun

          dat <- read.csv(paste0("data",mun,".csv")
          tot.dat <- sum(dat$x)
          mat[mat[,1]== mun,2] <- tot.dat
        }

【问题讨论】:

  • 你读过包小插曲吗? foreach 循环与for 循环根本不同。最重要的是,它们不会产生副作用(至少在用于并行化时)。这意味着您不能从循环内部分配给循环外部的对象(例如mat)。无论如何,你可以简单地做foreach(mun = unique(dat$mun))
  • 另外,read.csv 很有可能是大部分时间。如果是这样,请考虑使用包 data.table 中的fread(“f”代表“fast”)。它可能会快很多数量级,并且您可能不需要并行化。
  • 除了@Roland 建议使用fread,我不相信这在任何情况下都是并行化的好选择,因为每个 for 循环都需要读取文件。并行执行这些任务很容易导致更多的磁盘寻道,从而导致操作速度变慢而不是更快。
  • 好的。谢谢你的建议。我会阅读更多内容。

标签: r foreach parallel-foreach


【解决方案1】:

这可能是一种解决方案。 请注意,我在这里使用的是 Windows,并且我指定了 registerDoParallel() 以使其工作。

library(foreach)
library(doParallel)

# number of iterations
iters <- 5563

registerDoParallel()
mun <- unique(dat$mun)

tableList <- foreach(i=1:iters) %dopar% {
  dat <- read.csv(paste0("data",mun[i],".csv")
  tot.dat <- sum(dat$x)
}
unlist(tableList)

基本上,{...} 中的任何结果都将存储在列表中。 在这种情况下,结果(tot.dat 是一个数字)在tableList 中编译,通过执行unlist() 我们可以将其转换为向量以供进一步使用。

{...} 中的结果可以是任何东西、单个数字、向量、数据框或任何东西。 解决您的问题的另一种方法是将所有现有数据组合在一起,并用适当的源文件对其进行标记,因此中间组件看起来像

library(plyr)
tableAll <- foreach(i=1:iters) %dopar% {
  dat <- read.csv(paste0("data",mun[i],".csv")
  dat$source = mun[i]
}
rbind.fill(tableAll)

然后我们可以用它来做进一步的分析。

【讨论】:

    猜你喜欢
    • 2021-07-12
    • 2019-04-04
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多