在plyr中并行,修改全局变量
parallel in plyr, modifying a global variable
我正在尝试读取数千个文件并计算一些统计数据。该文件很大(2D 地图),我无法将整个数据保存到内存中。因此,我想一个一个读取文件并计算一些指标,如总和和数据数量,这些指标可以在读取所有文件后用于计算均值。
我可以使用 plyr::laply 读取文件,
sum<-matrix()
plyr::laply(fileNameList, function(x){
data <- readFunction(x) # this part is the most time consuming part which I need the parallel part for.
sum <<- sum + data
}, .parallel = TRUE)
我的问题是这是如何并行完成的。它是否锁定一个进程的总和值并在完成后解锁并为下一个进程解锁?我已经检查了一些简单的例子,例如:
a<-2
plyr::llply(c(1:100000), function(x) return(a<-a+x), .parallel=TRUE)
非常感谢!
这是一个使用 foreach
包对每个循环迭代的结果求和的解决方案。这是一个玩具示例:
# Package to run for loops in parallel
library(foreach)
# Register a parallel backend
library(doMC)
# Do job in parallel with 2 cores
registerDoMC(2)
# Make 100 random 3x3 matrices and sum the results with .combine = '+'
# %dopar% tells foreach to run this loop in parallel
result <- foreach(i=1:100, .combine = '+') %dopar% {
matrix(rnorm(9), nrow = 3, ncol = 3)
}
result
# [,1] [,2] [,3]
#[1,] -1.475609 4.358915 2.471485
#[2,] -3.692420 -3.923253 -6.362911
#[3,] -4.628771 -12.974234 -6.032499
对于您的情况,根据您在示例中提供的代码,您可以尝试以下操作:
result <- foreach(i = seq_along(fileNameList), .combine = '+') %dopar% {
readFunction(fileNameList[i])
}
我不知道阻塞或解除阻塞,但如果将结果分配给向量的索引,你应该是安全的。您可以将索引而不是列表本身传递给 laply。
myList<-list(a=sample(1:100,5), b=sample(1:100,5), c=sample(1:100,5))
sumVec<-rep(0,length(myList))
plyr::laply(1:length(myList),
function (x){
sumVec[x]<<-sum(myList[[x]])
},
.parallel=TRUE
)
我正在尝试读取数千个文件并计算一些统计数据。该文件很大(2D 地图),我无法将整个数据保存到内存中。因此,我想一个一个读取文件并计算一些指标,如总和和数据数量,这些指标可以在读取所有文件后用于计算均值。
我可以使用 plyr::laply 读取文件,
sum<-matrix()
plyr::laply(fileNameList, function(x){
data <- readFunction(x) # this part is the most time consuming part which I need the parallel part for.
sum <<- sum + data
}, .parallel = TRUE)
我的问题是这是如何并行完成的。它是否锁定一个进程的总和值并在完成后解锁并为下一个进程解锁?我已经检查了一些简单的例子,例如:
a<-2
plyr::llply(c(1:100000), function(x) return(a<-a+x), .parallel=TRUE)
非常感谢!
这是一个使用 foreach
包对每个循环迭代的结果求和的解决方案。这是一个玩具示例:
# Package to run for loops in parallel
library(foreach)
# Register a parallel backend
library(doMC)
# Do job in parallel with 2 cores
registerDoMC(2)
# Make 100 random 3x3 matrices and sum the results with .combine = '+'
# %dopar% tells foreach to run this loop in parallel
result <- foreach(i=1:100, .combine = '+') %dopar% {
matrix(rnorm(9), nrow = 3, ncol = 3)
}
result
# [,1] [,2] [,3]
#[1,] -1.475609 4.358915 2.471485
#[2,] -3.692420 -3.923253 -6.362911
#[3,] -4.628771 -12.974234 -6.032499
对于您的情况,根据您在示例中提供的代码,您可以尝试以下操作:
result <- foreach(i = seq_along(fileNameList), .combine = '+') %dopar% {
readFunction(fileNameList[i])
}
我不知道阻塞或解除阻塞,但如果将结果分配给向量的索引,你应该是安全的。您可以将索引而不是列表本身传递给 laply。
myList<-list(a=sample(1:100,5), b=sample(1:100,5), c=sample(1:100,5))
sumVec<-rep(0,length(myList))
plyr::laply(1:length(myList),
function (x){
sumVec[x]<<-sum(myList[[x]])
},
.parallel=TRUE
)