我试图让用于在 R 中进行并行处理的 foreach 包正常工作,但我遇到了几个问题:
Windows 的 CRAN 上不存在使 foreach 工作所需的 doMC 包。一些博客建议 doSNOW 应该做同样的工作。但是,当我使用 doSNOW 运行 foreach 命令时,%dopar%
似乎并不比 %do%
运行得更快。事实上它要慢得多。我的 CPU 是 Intel i7 860 @ 2.80GHz,内存为 8 GB。下面是我的代码:
##Run example in 1 core
require(foreach)
require(doSNOW)
x= iris[which(iris[,5] != "setosa"),c(1,5)]
trials = 10000
system.time({
r= foreach(icount(trials), .combine=cbind) %do% {
ind=sample(100,100,replace=TRUE)
results1 = glm(x[ind,2]~x[ind,1],family=binomial(logit))
coefficients(results1)
}
})[3]
# elapsed
# 37.28
# Same example in 2 cores
registerDoSNOW(makeCluster(2,type="SOCK"))
getDoParWorkers()
trials = 10000
system.time({
r= foreach(icount(trials), .combine=cbind) %dopar% {
ind=sample(100,100,replace=TRUE)
results1 = glm(x[ind,2]~x[ind,1],family=binomial(logit))
coefficients(results1)
}
})[3]
# elapsed
# 108.14
我重新安装了所有需要的包,但仍然是同样的问题。这是输出:
sessionInfo()
#R version 2.15.1 (2012-06-22)
#Platform: i386-pc-mingw32/i386 (32-bit)
#locale:
#[1] LC_COLLATE=English_United States.1252
#[2] LC_CTYPE=English_United States.1252
#[3] LC_MONETARY=English_United States.1252
#[4] LC_NUMERIC=C
#[5] LC_TIME=English_United States.1252
#attached base packages:
#[1] parallel stats graphics grDevices datasets utils methods
#[8] base
#other attached packages:
#[1] doParallel_1.0.1 codetools_0.2-8 doSNOW_1.0.6 snow_0.3-10
#[5] iterators_1.0.6 foreach_1.4.0 rcom_2.2-5 rscproxy_2.0-5
#loaded via a namespace (and not attached):
#[1] compiler_2.15.1 tools_2.15.1
最佳答案
您最好在 Windows 中使用 doParallel()
:
require(foreach)
require(doParallel)
cl <- makeCluster(6) #use 6 cores, ie for an 8-core machine
registerDoParallel(cl)
然后运行您的foreach() %dopar% {}
编辑:OP 提到仍然看到问题,所以包括我的确切代码。在 4 核 Windows7 VM 上运行,R 2.15.1 32 位,只允许 doParallel
使用我的 3 个内核:
require(foreach)
require(doParallel)
cl <- makeCluster(3)
registerDoParallel(cl)
x= iris[which(iris[,5] != "setosa"),c(1,5)]
trials = 1000
system.time(
foreach(icount(trials), .combine=cbind) %do%
{
ind=sample(100,100,replace=TRUE)
results1 = glm(x[ind,2]~x[ind,1],family=binomial(logit))
results1 = glm(x[ind,2]~x[ind,1],family=binomial(logit))
results1 = glm(x[ind,2]~x[ind,1],family=binomial(logit))
results1 = glm(x[ind,2]~x[ind,1],family=binomial(logit))
coefficients(results1)
})[3]
system.time(
foreach(icount(trials), .combine=cbind) %dopar%
{
ind=sample(100,100,replace=TRUE)
results1 = glm(x[ind,2]~x[ind,1],family=binomial(logit))
results1 = glm(x[ind,2]~x[ind,1],family=binomial(logit))
results1 = glm(x[ind,2]~x[ind,1],family=binomial(logit))
results1 = glm(x[ind,2]~x[ind,1],family=binomial(logit))
coefficients(results1)
})[3]
在我的例子中,%do%
得到 17.6 秒,%dopar%
得到 14.8 秒。观察任务执行,似乎大部分执行时间都在 cbind
上,这是并行运行的常见问题。在我自己的模拟中,我做了自定义工作以将我的详细结果保存为并行任务的一部分,而不是通过 foreach
返回它们,以消除那部分开销。 YMMV.
关于windows - R 中的 doMC 和 foreach 循环不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11617506/