2

我需要并行运行冗长且计算密集的回测。我的回测平均需要运行 8 个小时,我需要运行 30 个。它们都使用不同的输入调用相同的函数。到目前为止,我能找到的是下面使用 foreach 包的代码。

require(foreach)
require(parallel)
require(doParallel)

cores = detectCores() #32
cl<-makeCluster(cores) #register cores
registerDoParallel(cl, cores = cores)

foreach (j=1:2) %dopar% {

     if(j == 1)
     {
      get_backtestRUN(inputA)
     }

     if(j == 2)
     {
      get_backtestRUN(inputB)
     }   
}

我的第一个问题更笼统,我想知道上面的包是否是解决我的问题的最佳方法。

我的第二个问题与额外计算能力的使用有关,因为我只能在我的本地机器上并行运行 8 个回测,网上有很多选择,并且希望就最适合 R 的方式提出建议。

感谢您的帮助和时间,

4

1 回答 1

1

这个链接很清楚地回答了我的问题:

https://www.r-bloggers.com/how-to-go-parallel-in-r-basics-tips/

下面是重要部分:

foreach 包背后的想法是创建“标准 for 循环和 lapply 函数的混合体”,其易用性使其相当受欢迎。设置略有不同,您需要“注册”集群,如下所示:

library(foreach)
library(doParallel)

cl<-makeCluster(no_cores)
registerDoParallel(cl)

请注意,您可以将最后两行更改为:

registerDoParallel(no_cores)

但是你需要记住,而不是 stopCluster() 最后做:

stopImplicitCluster()

foreach 函数可以被视为 parSapply 的更受控制的版本,它允许将结果组合成合适的格式。通过指定 .combine 参数,我们可以选择如何组合我们的结果,下面是一个向量、矩阵和一个列表示例:

foreach(exponent = 2:4, 
        .combine = c)  %dopar%  
  base^exponent

foreach(exponent = 2:4, 
        .combine = rbind)  %dopar%  
  base^exponent

         [,1]
result.1    4
result.2    8
result.3   16

foreach(exponent = 2:4, 
        .combine = list,
        .multicombine = TRUE)  %dopar%  
  base^exponent

[[1]]
[1] 4

[[2]]
[1] 8

[[3]]
[1] 16

请注意,最后一个是默认设置,无需任何调整即可实现,只需 foreach(exponent = 2:4) %dopar%。在示例中,值得注意的是避免嵌套列表所需的 .multicombine 参数。嵌套的发生是由于连续的 .combine 函数调用,即 list(list(result.1, result.2), result.3):

foreach(exponent = 2:4, 
        .combine = list)  %dopar%  
  base^exponent
[[1]]
[[1]][[1]]
[1] 4

[[1]][[2]]
[1] 8


[[2]]
[1] 16
于 2016-09-01T18:36:55.887 回答