我需要并行运行冗长且计算密集的后端测试。 我的回测平均需要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方式的建议。< / p>
感谢您的帮助和时间,
答案 0 :(得分:1)
此链接非常清楚地回答了我的问题:
https://www.r-bloggers.com/how-to-go-parallel-in-r-basics-tips/
重要部分:
foreach包背后的想法是创建'循环和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