我有一个特殊的模拟要执行,这需要一些时间在R中运行。由于我想执行1000次模拟,我决定使用“并行”包来分配这些模拟超过4个核心。我知道如果我有一个像下面这样的函数,我可以得到一个结果向量。
results_parallel <- parSapply(cl, c(1000,1000,1000,1000), rnorm)
在这里,rnorm()只有一个参数作为输入,因此我可以要求使用4个核心生成4000个值。
但我的模拟有多个参数。我的问题是,由于我有多个参数作为输入,如何判断应使用4个核心计算哪个参数?如果simulation1(A,B,C,m)
是我的函数,其中m是模拟的数量,我想让每个核心进行250次模拟,这样我最终可以得到1000次模拟。谁能给我一个提示?
答案 0 :(得分:4)
你可以尝试创建一个函数包装器,它接受一个参数而不是多个参数。
rnorm1 <- function(ls){
rnorm(n = ls$n, mean = ls$mean, sd = ls$sd)
}
cl <- makeCluster(2)
example_list <- list(
list(n=1000, mean = 0, sd = 1),
list(n=1000, mean = 1, sd = 2)
)
results_parallel <- parSapply(cl, example_list, rnorm1)
您只需指定所需的参数列表,以便它是列表列表。
答案 1 :(得分:1)
我不确定这正是您所追求的,但您应该能够在函数调用中添加要传递给rnorm
的参数。我之前没有使用parSapply
,但这里是llply
:
doMC::registerDoMC( cores = 4 )
results <- plyr::llply( .data = c(1000,1000,1000,1000),
.fun = rnorm, mean = 1, sd = 0.4,
.parallel = T
)
请注意mean
调用中传递给sd
的参数rnorm
和llply
。 parSapply
应该能够以同样的方式处理这个问题。例如:
results_parallel <- parSapply( cl,
X = c(1000,1000,1000,1000),
FUN = rnorm, mean = 1, sd = 0.4
)