在 R 中使用 parSapply() 并行化时如何导出具有修改值的全局变量
How to export global variable with modified values when using parallelization in R with parSapply()
我正在使用 R 中“并行”包中的 parSapply 来优化计算量大的代码。该代码运行良好,最终答案与我的代码的串行版本相同。唯一的问题是我有一个全局变量,其值在代码期间发生变化,但 parSapply 函数无法将更改应用于全局变量。这是一个简单的例子:
M = matrix(1,5,5)
test = function(x){
M[x,x] <<- x
}
sapply(c(1:5), function(x) test(x))
M
no_of_cores = detectCores()
cl = makeCluster(no_of_cores)
clusterExport(cl, varlist = c("test","M"), envir=environment())
parSapply(cl, c(1:5), function(x) test(x))
M
当我使用sapply函数时,M的值修改正确,但是当我使用parSapply时,M没有改变!我感谢解决此问题的任何建议!谢谢
我们可以用foreach
library(doSNOW)
library(parallel)
no_of_cores = detectCores()
cl <- makeSOCKcluster(no_of_cores)
registerDoSNOW(cl)
M <- matrix(1,5,5)
comb <- function(m, ...) {
for (r in list(...)) {
m[r$k, r$k] <- r$k
}
m
}
out <- foreach(k=1:5, .combine='comb', .init=M,
.multicombine=TRUE) %dopar% {
m <- M
list(k=k, m=m)
}
-输出
out
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 1 1 1
[2,] 1 2 1 1 1
[3,] 1 1 3 1 1
[4,] 1 1 1 4 1
[5,] 1 1 1 1 5
我正在使用 R 中“并行”包中的 parSapply 来优化计算量大的代码。该代码运行良好,最终答案与我的代码的串行版本相同。唯一的问题是我有一个全局变量,其值在代码期间发生变化,但 parSapply 函数无法将更改应用于全局变量。这是一个简单的例子:
M = matrix(1,5,5)
test = function(x){
M[x,x] <<- x
}
sapply(c(1:5), function(x) test(x))
M
no_of_cores = detectCores()
cl = makeCluster(no_of_cores)
clusterExport(cl, varlist = c("test","M"), envir=environment())
parSapply(cl, c(1:5), function(x) test(x))
M
当我使用sapply函数时,M的值修改正确,但是当我使用parSapply时,M没有改变!我感谢解决此问题的任何建议!谢谢
我们可以用foreach
library(doSNOW)
library(parallel)
no_of_cores = detectCores()
cl <- makeSOCKcluster(no_of_cores)
registerDoSNOW(cl)
M <- matrix(1,5,5)
comb <- function(m, ...) {
for (r in list(...)) {
m[r$k, r$k] <- r$k
}
m
}
out <- foreach(k=1:5, .combine='comb', .init=M,
.multicombine=TRUE) %dopar% {
m <- M
list(k=k, m=m)
}
-输出
out
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 1 1 1
[2,] 1 2 1 1 1
[3,] 1 1 3 1 1
[4,] 1 1 1 4 1
[5,] 1 1 1 1 5