我正在尝试阅读数千个文件并计算一些统计信息。文件很大(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)
我的问题是这是如何并行完成的。它是否锁定了一个进程的sum值并在完成后解锁并为下一个进程解锁?我已经检查了一些简单的例子,例如:
a<-2
plyr::llply(c(1:100000), function(x) return(a<-a+x), .parallel=TRUE)
非常感谢!
答案 0 :(得分:0)
这是一个使用f(1)=figure();
f(2)=figure();
x = 1:10;
plot(x,x);
drawnow;
for ix=1:numel(f)
waitfor(f(ix));
end
包对每个循环迭代的结果求和的解决方案。这是一个玩具示例:
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
答案 1 :(得分:0)
我不知道阻塞或解除阻塞,但如果将结果分配给向量的索引,则应该是安全的。你可以传递索引而不是列表本身。
<p>a</p>
<div><p>a</p></div>
<p> </p>
<div><p>a</p></div>