通过doSNOW包进行R并行计算,注册但不占用CPU内核的进程

时间:2014-11-13 20:27:05

标签: r parallel-processing

我在桌面上使用doSNOW包。

cl <- makeCluster(6, type="SOCK")
registerDoSNOW(cl)
m <- matrix(rnorm(90000), 30000, 3)
foreach(i=1:nrow(m), .combine=rbind) %dopar% (m[i,] / mean(m[i,]))
stopCluster(cl)

当上面的程序运行时,我打开了窗口任务管理器,在进程选项卡中,我看到有5个或6个新创建的进程名为&#34; Rscript.exe&#34;,但只有一个在跑。

我正在使用我的办公桌面。我记得第一次使用&#34; doSNOW&#34;在我自己的笔记本电脑上,Windows弹出一个小的对话栏,要求获得某种许可,但我的办公桌面从未问过我。我不知道我的情况是否与某些系统块有关,只需注意这里。

非常感谢谁可以帮助我。

此致 查理

1 个答案:

答案 0 :(得分:4)

问题是任务太小。似乎正在运行的一个过程可能是所有30,000个结果的主人。

如果你有许多微小的任务,你应该将它们组合成更少,更大的任务,这称为 chunking 。以下是为您的示例执行此操作的一种方法:

library(doSNOW)
library(itertools)
cl <- makeCluster(6, type="SOCK")
registerDoSNOW(cl)
m <- matrix(rnorm(90000), 30000, 3)

foreach(s=isplitRows(m, chunks=getDoParWorkers()), .combine='rbind') %dopar% {
  t(apply(s, 1, function(x) x / mean(x)))
}

在我的MacBook Pro上,这比你的版本快70多倍。您可以使用像Rcpp这样的东西更快地解决这个特定问题,但这项技术非常重要,至少看起来只有一个进程正在进行任何工作。