windows - R 中的 doMC 和 foreach 循环不起作用

标签 windows r foreach parallel-processing domc

我试图让用于在 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/

相关文章:

多个文件上的方差分析的 R 循环

php - foreach 改变最后一个元素

java - 从 lambda 表达式返回值?

c# - Java 增强的 for 循环 VS .NET foreach 循环

windows - 来自命令提示符的 sqlite - 无法识别的命令

c# - 如何从 .NET 客户端应用程序加载 URL

r - gtsummary::tbl_regression 使用 pool_and_tidy_mice() 和 tidy_standardize()

无法以附加或写入模式打开文件

windows - 用于在 Mac 上进行网站测试的虚拟化 Windows 7 和 IE VHD - 需要什么?

r - 仅折叠 R 中数据框的第一列,其余列数据完好无损