使用bigmemory的R foreach比串行执行花费更多时间

时间:2014-06-09 19:54:57

标签: r foreach

我正在使用大尺寸矩阵(1.5GB并且正在增长)。一个特定的功能是花费大量时间,它似乎是使用foreach包进行并行化的一个很好的候选者。我在Ubuntu上用registerDoParallel(cores = 4)运行它,带有4个内存和8GB RAM。当我使用foreach时,我理解将为所有4个进程制作一个大矩阵的副本。我很快就看到内存使用率达到100%。我read another发布建议使用bigmemory并使用attach.big.matrix(),因此进程可以共享相同的矩阵。我肯定有足够的RAM来保存内存中的副本。但是当我这样做时,我注意到执行所花费的时间实际上增加了。

user    system   elapsed

9889.944  185.590 2670.001    - DoParallel with 4 cores!

8931.887   92.214 4526.306    - DoParallel with 2 cores!

9320.523  150.122 9473.165    - DoParallel with 1 core!

1314.037    6.236 1320.290    - Serial execution without foreach and without big.matrix.

我无法对此提出解释。以下是我的代码。我已经尝试了一些其他的东西,例如向每个进程发送一个块(默认情况下foreach也似乎也这样做)。没有什么能比串行更快地执行。当我将内核设置为4时,我确实看到所有4个内核都以100%使用。使用bix.matrix似乎有超过1个内核的改进,但是从未使用过大矩阵的串行执行没有任何改进。

calcQIDiffForRow <- function(row, Desc){
  mat <- attach.big.matrix(Desc)
  x <- mat[row, ]
  for(j in 1:(row - 1)) {
    y <- mat[j, ]
    ...
  }
  return(val)
}

calcQIDiff <- function(mat){
  registerDoParallel(cores=4)
  desc <- describe(mat)
  ret <- foreach(i = 1:nrow(mat), .combine=rbind, .multicombine=T, 
                 .noexport=c("mat")) %dopar% calcQIDiffForRow(i, Desc)
  return(ret)
}

system.time(QIdiff.parallel <- calcQIDiff(as.big.matrix(bigmatrix))).

0 个答案:

没有答案