在plyr中并行,修改全局变量

时间:2015-10-22 19:44:26

标签: r parallel-processing

我正在尝试阅读数千个文件并计算一些统计信息。文件很大(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)

非常感谢!

2 个答案:

答案 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>