foreach高效并行的例子


在foreach包的mannual中,高效并行的例子:
将行分块后,发送到各个workers:

applyKernel <- function(newX, FUN, d2, d.call, dn.call = NULL, ...) {
  foreach(x = iblkcol(newX, 3), .combine = "c", .packages = "foreach")%dopar% {
     foreach(i = 1:ncol(x)) %do% FUN(array(x[, i], d.call, dn.call), ...)
  }
}
applyKernel(matrix(1:16, 4), mean, 4, 4)

会报错:Error in eval(expr, envir, enclos) : could not find function "iblkcol"


解决方法一:将以下iblkcol函数加入foreach/iterators包的source中

iblkcol <- function(a, chunks) {
  n <- ncol(a)
  i <- 1

  nextElem <- function() {
    if (chunks <= 0 || n <= 0) stop('StopIteration')
    m <- ceiling(n / chunks)
    r <- seq(i, length=m)
    i <<- i + m
    n <<- n - m
    chunks <<- chunks - 1
    a[,r, drop=FALSE]
  }

  structure(list(nextElem=nextElem), class=c('iblkcol', 'iter'))
}

nextElem.iblkcol <- function(obj) obj$nextElem()


解决方法二:改用通用的iter函数参数iterator

applyKernel <- function(newX, FUN, d2, d.call, dn.call = NULL, ...) {
  foreach(x = iter(newX,chunks=3), .combine = "c", .packages = "foreach")%dopar% {
     foreach(i = 1:ncol(x)) %do% FUN(array(x[, i], d.call, dn.call), ...)
  }
}
applyKernel(matrix(1:16, 4), mean, 4, 4)


你可能感兴趣的:(并行计算)