R的foreach包中的工人表现不佳

时间:2018-09-24 14:24:00

标签: r foreach doparallel

我正在Windows中使用foreach和doParallel软件包,但是在foreach函数中,代码中使用的CPU少于10%。这是我在一个小示例中使用的代码。

library(doParallel)
library(foreach)
library(dplyr)
library(Matrix)
cl <- detectCores() - 1  
registerDoParallel(cl)
n_max=1300000
df=data.frame(fromID=sample(c(1:1300000),2000,replace=TRUE),
              toID=sample(c(1:1300000),2000,replace=TRUE),
              group=sample(c(1:10),2000,replace=TRUE))
As=foreach (i=1:10,.packages=c('dplyr','Matrix'))%dopar%{
  databygroup=filter(df,group==i)
        sparseMatrix(i=databygroup$fromID,j=databygroup$toID,x=1,dims=c(n_max,n_max))
}  

stopImplicitCluster()

在使用foreach之前,我得到的结果是要知道有多少工人处于活动状态。

> cat(sprintf('%s backend is registered\n',
+             if(getDoParRegistered()) 'A' else 'No'))
A backend is registered
> cat(sprintf('Running with %d worker(s)\n', getDoParWorkers()))
Running with 35 worker(s)
> (name <- getDoParName())
[1] "doParallelSNOW"
> (ver <- getDoParVersion())
[1] "1.0.11"
> if (getDoParRegistered())
+   cat(sprintf('Currently using %s [%s]\n', name, ver))
Currently using doParallelSNOW [1.0.11]

我收到的消息是针对多个连接的

“在if(.Internal(exists(package,.Internal(getNamespaceRegistry()),...:   关闭未使用的连接70 ...“

使用“ stopImplicitCluster”功能后,工作程序数量相同。因此,我无法关闭工人。

stopCluster(cl)不起作用

> cat(sprintf('Running with %d worker(s)\n', getDoParWorkers()))
Running with 2 worker(s)
> (name <- getDoParName())
[1] "doParallelSNOW"
> (ver <- getDoParVersion())
[1] "1.0.11"
> if (getDoParRegistered())
+ cat(sprintf('Currently using %s [%s]\n', name, ver))
Currently using doParallelSNOW [1.0.11]
> stopCluster(cl)
> cat(sprintf('Running with %d worker(s)\n', getDoParWorkers()))
Running with 2 worker(s)
> stopCluster(cl)
Error in summary.connection(connection) : invalid connection

我不知道为什么并行化不起作用。

谢谢您的时间

1 个答案:

答案 0 :(得分:0)

该代码是正确的,但是问题在于计算机在任务之间花费大量时间。这就是为什么使用的CPU如此之低。