r - 为什么这个 foreach/dopar 函数没有使用我要求的所有内核?

标签 r foreach parallel-processing domc

我正在尝试将 doMCforeach%dopar% 一起使用。这是函数:

doTheMath_MC <- function(st, end, nd) {

    print(getDoParWorkers())    
    if (st > end) stop("end must be larger than st")

    # Helper function from stackoverflow.com/a/23158178/633251
    tr <- function(x, prec = 0) trunc(x * 10^prec) / 10^prec

    # Function to use with foreach
    fef <- function(i, j, num, trpi) {
        if (num[j] >= num[i]) return(NULL)
        val <- num[i]/num[j]
        if (!tr(val, nd) == trpi) return(NULL)
        return(c(i, j, tr(val, nd)))
        }

    # Here we go...

    nd <- nd - 1
    trpi <- tr(pi, nd)
    num <- st:end
    ni <- length(num)

    ans <- foreach(i = 1:ni, .combine = rbind) %:%
        foreach(j = 1:ni, .combine = rbind) %dopar% {
            fef(i, j, num, trpi)
            }
    cat("Done computing", paste("EST", st, end, nd+1, sep = "_"), "\n")
    if (is.null(ans)) return(NULL)
    ans <- as.matrix(na.omit(ans)) # probably not needed in MC version
    return(ans) # c("num", "den", "est", "eff")
    }

我之前已经设置了核心,另一个函数调用了上面的函数(这个信息发布在下面,我不认为这是问题所在)。 getDoParWorkers() 报告已按预期分配了 7 个内核。 cat 语句验证 2 个“循环”在输出时是否正常工作。但是,只使用了 1 个核心。有人知道为什么吗? Mac OSX 10.10.2 和 R 3.2 (2015-03-15 r67992)。最后,使用 doParallel 控制所有内容会得到相同的结果。

设置一切的步骤:

mn <- 1
mx <- 10000
jmp <- 1000
mc <- TRUE

if (mc)     {
    require("doMC")
    registerDoMC(7)
    }

st <- seq(mn -1, mx - jmp, jmp) + 1
end <- seq(mn - 1 + jmp, mx, jmp)
nd <- rep(1:15, each = mx/jmp) # watch the recycling

df <- data.frame(st = st, end = end, nd = nd)

for (i in 1:nrow(df)) {
    findEsts(df$st[i], df$end[i], df$nd[i], MC = mc)
    }

最佳答案

很抱歉回答我自己的问题!我更改了 dopar 处理,以便只有外部循环是并行的:

ans <- foreach(i = 1:ni, .combine = rbind) %dopar%
   for (j in 1:ni) {
   fef(i, j, num, trpi)
   }

而且,我只是没有要求足够的迭代。为了进行测试,我一直在使用 mx = 10000jmp = 1000(请参阅原始问题)。这些显然不足以触发并行处理。每增加 10 倍对于进行并行处理是必要的。感谢评论者!

注意:虽然上面的代码激活了并行处理,但它没有正确返回答案。那将是另一个问题的主题。

关于r - 为什么这个 foreach/dopar 函数没有使用我要求的所有内核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29111785/

相关文章:

r - ggplotly如何更改工具提示和右侧的文本

r - 基于使用 R 的另一个数据集中日期的日期之间的平均值

java - 保证 Array 处理顺序 .each() Groovy

PHP 递归 foreach 意外行为

oracle - 有没有办法保证 PL/SQL 作业的 DAP?

go - golang 中的生产者消费者 - 并发与并行?

perl - 在 fork 里失去 child

r - 如何找到 R 中 GEV 分布中给定值的累积概率?

R: Rgtk2: gwidgets: gWidgetsRGtk2

erlang - 使用 ets :foldl as a poor man's forEach on every record