我正在尝试将doMC
与foreach
和%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)
}
答案 0 :(得分:0)
很抱歉回答我自己的问题!我改变了dopar
处理,以便只使外环平行:
ans <- foreach(i = 1:ni, .combine = rbind) %dopar%
for (j in 1:ni) {
fef(i, j, num, trpi)
}
而且,我根本就没有要求足够的迭代。为了进行测试,我一直在使用mx = 10000
和jmp = 1000
(请参阅原始问题)。这些不足以显然触发并行处理。为了获得并行处理,每增加10倍是必要的。感谢评论者!
注意:虽然上面的代码激活并行处理,但它不能正确返回答案。这将是另一个问题的主题。