Foreach 代替 for 循环

时间:2021-04-17 07:45:39

标签: r multithreading for-loop foreach time-series

我有一个大型数据库,我编写了一个代码,该代码通过将其嵌套在 for 循环中以滚动方式执行相同的计算。我的问题是代码运行时间很长。正如我所读到的,这可能是由 R 使用单线程方法作为默认值引起的。据我所知,foreach 包可以在相当长的时间内加快执行速度,但是,我不确定如何实现它。目前,我的代码看起来像这样,在每次迭代中,我都会对大型数据库的一部分进行子集化,并使用这些子集执行各种操作。在迭代结束时,我按时间序列收集输出。这种情况可以申请foreach吗?

(k in seq(1,5284, 21)) {
   fdata <- data[k:(k+251),]
   tdata <- data[(k+252):(k+377),]
}

谢谢!

1 个答案:

答案 0 :(得分:1)

这当然可以使用 foreach。根据您的操作系统,您首先必须加载合适的后端(例如 Windows 机器上的 SNOW),然后设置集群。

示例:

library(foreach)
library(doSNOW)

# set number of cores/CPUs to be used
(n_cores <- parallel::detectCores() - 1)

# some example data
dat <- matrix(1:1e3, ncol = 10)

# a set you iterate over
k <- 1:99

# run stuff in parallel
cl <- makeCluster(n_cores)
registerDoSNOW(cl)
  
  result <- foreach(k) %dopar% {

    fdata <- dat[k:(k+1), ]
    # do computationally expensive stuff with `fdata`
    # ... and return something
    cumsum(fdata[1,] + fdata[2,])

  }

stopCluster(cl)

默认情况下,result 将是结果列表。然而,有一些方法可以组合成一个数组或类似的东西。查看 .combine?foreach 参数的详细信息。