foreach高效并行的例子

来源:互联网 发布:淘宝号怎么快速升3心 编辑:程序博客网 时间:2024/06/06 07:46

在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)


原创粉丝点击