简单的R foreach示例

时间:2016-07-21 18:01:19

标签: r parallel-processing

我是R的新手,最近需要在列表中找到具有特定值的元素索引。我尝试使用foreach加速操作,并比较了两种方法。在下面的代码中' a'是列表和' b'是我们想要在' a':

中检索其索引的值
library("iterators")
library("foreach")
library("doParallel")
a <- 1:200000
b <- sample(1:200000,100000,replace=TRUE)
registerDoParallel()
getDoParWorkers(); #to see the number of cores
system.time(unlist(lapply(b,function(x) which(a==x))))
system.time(foreach(i<-iter(b),.combine='c') %dopar% { which(a==b) })

输出:

Loading required package: parallel
[1] 32
   user  system elapsed 
124.648   7.460 132.114 
   user  system elapsed 
402.076  59.164  55.260 

我想知道:1)天真地,为什么这个操作会变慢?我还没有检查过,但我认为脚本语言可以更快地做同样的事情。 2)并不能很好地并行运行规模,因为我有32个可用核心,所以它似乎还需要比预期更长的时间。 3)实际上我正在遍历矩阵的行,即foreach(i&lt; -iter(b,by =&#39; row&#39;),。combine =&#39; c&#39;)%dopar% { #东西 }。我的理解是这种方法是最好的,因为它不会将整个矩阵发送到每个核心。有没有办法通过检查每个核心接收的数据来确认?

1 个答案:

答案 0 :(得分:0)

您进行1e5 * 2e5比较。这需要一些时间,这并不奇怪。

如果将每个迭代单独发送给工作人员,则每个人which(a==x)都不会那么慢,并且会有很多并行化开销。发送一串迭代会好得多。在非Windows系统上,您只需使用mclapply

即可
a <- 1:20000
b <- sample(1:20000,10000,replace=TRUE)

library(parallel)
system.time(res1 <- unlist(lapply(b,function(x) which(a==x))))
# user      system     elapsed 
#0.597       0.178       0.789 
system.time(res2 <- unlist(mclapply(b,function(x) which(a==x), 
                                    mc.preschedule = TRUE, mc.cores = 3)))
# user      system     elapsed 
#0.004       0.022       0.325 
all.equal(res1, res2)
#[1] TRUE

关于3):可能有比并行化更好的方法(最好是矩阵代数),但这取决于你的#stuff