首页 > 解决方案 > Foreach 代替 for 循环

问题描述

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

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

谢谢!

标签: rmultithreadingfor-loopforeachtime-series

解决方案


这当然是可行的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


推荐阅读