如何并行化具有多个参数的函数?
How to parallelize a function which has more than one parameter?
我有一个特定的模拟要执行,这需要一些时间才能在 R 中 运行。因为我想执行 1000 次模拟,所以我决定使用 "parallel" 包将这些模拟分布在 4 个内核上.我知道如果我有如下函数,我可以获得结果向量。
results_parallel <- parSapply(cl, c(1000,1000,1000,1000), rnorm)
这里 rnorm() 只有一个参数作为输入,所以我可以要求使用 4 个内核生成 4000 个值。
但是我的模拟有不止一个参数。我的问题是,由于我有多个参数作为输入,我如何判断应该使用 4 个内核计算哪个参数?如果 simulation1(A,B,C,m)
是我的函数,其中 m 是模拟次数,我想要求每个核心进行 250 次模拟,这样最终我可以获得 1000 次模拟。谁能给我提示?
您可以尝试创建一个采用单个参数而不是多个参数的函数包装器。
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)
您只需指定所需的参数列表,使其成为列表的列表。
我不确定这是否正是您想要的,但您应该能够在函数调用中添加要传递给 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
从 llply
调用中传递给 rnorm
。 parSapply
应该能够以同样的方式处理这个问题。例如:
results_parallel <- parSapply( cl,
X = c(1000,1000,1000,1000),
FUN = rnorm, mean = 1, sd = 0.4
)
我有一个特定的模拟要执行,这需要一些时间才能在 R 中 运行。因为我想执行 1000 次模拟,所以我决定使用 "parallel" 包将这些模拟分布在 4 个内核上.我知道如果我有如下函数,我可以获得结果向量。
results_parallel <- parSapply(cl, c(1000,1000,1000,1000), rnorm)
这里 rnorm() 只有一个参数作为输入,所以我可以要求使用 4 个内核生成 4000 个值。
但是我的模拟有不止一个参数。我的问题是,由于我有多个参数作为输入,我如何判断应该使用 4 个内核计算哪个参数?如果 simulation1(A,B,C,m)
是我的函数,其中 m 是模拟次数,我想要求每个核心进行 250 次模拟,这样最终我可以获得 1000 次模拟。谁能给我提示?
您可以尝试创建一个采用单个参数而不是多个参数的函数包装器。
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)
您只需指定所需的参数列表,使其成为列表的列表。
我不确定这是否正是您想要的,但您应该能够在函数调用中添加要传递给 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
从 llply
调用中传递给 rnorm
。 parSapply
应该能够以同样的方式处理这个问题。例如:
results_parallel <- parSapply( cl,
X = c(1000,1000,1000,1000),
FUN = rnorm, mean = 1, sd = 0.4
)