3

と を使用しようとして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)
    }
4

1 に答える 1