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)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值