我正在用 R 中的并行编程尝试一些基本的东西。结果非常不一致。
我的第一个技巧是使用“并行”库中的 parSapply() 函数。结果是一致的。随着我在并行进程中添加更多内核,速度显着提高:
library(parallel)
# Initiate test list
testlist <- 2:10000000
# Initiate test function
testfunction <- function(x) {
c(x, x^2, x^3)
}
# Calculate the number of cores
no_cores <- detectCores()
# Initiate cluster
cl <- makeCluster(no_cores)
clusterExport(cl, "testlist")
# Execute things
system.time(parSapply(cl, testlist, testfunction))
# Close cluster
stopCluster(cl)
但是,我的第二种方法使用“foreach”包中的 foreach() 函数。其结果并不一致。当我使用 2 个内核而不是 1 个内核时,速度会提高。但是,当我使用 3 或 4 核时,没有任何改进。为什么会这样?
library(parallel)
library(foreach)
library(doParallel)
# Initiate test list
testlist <- 2:100000
# Initiate test function
testfunction <- function(x) {
c(x, x^2, x^3)
}
# Initiate separate parallel function
parallelfunction <- function(x) {
foreach(x = testlist, .combine = c, .export = "testfunction") %dopar% {
testfunction(x)
}
}
# Calculate the number of cores
no_cores <- detectCores() - 3
# Create an implicit cluster
registerDoParallel(no_cores)
# Do things
system.time(parallelfunction())
gc()
# Stop implicit cluster
stopImplicitCluster()
我通过更改“no_cores”值进行测试。(即no_cores <- detectCores() - x
)。列表大小对此没有影响。