为什么 foreach 和 %dopar%(doParallel 包)比 while 循环迭代慢?

时间:2021-07-09 19:53:52

标签: r performance foreach while-loop iterator

对以下代码使用 while 循环 大约需要 20 秒。在没有集群的情况下使用 foreach%dopar% 大约需要 25 秒,使用集群大约需要 28 秒。

我正在寻求澄清,因为我已经阅读了 here on stackoverflow 并行处理的小任务可能会变慢,但是当我增加 iproduct 中数字的 +/- 时并行处理仍然较慢。

这是因为;

  1. 我正在使用 iproduct 而应该使用不同的迭代器或
  2. iproduct 迭代的数据量需要大得多,并行化才有意义或
  3. while 循环中的计算量是一项小任务,因此并行化不会让它更快。

让我的代码运行得更快的任何帮助都会很棒。

我的最终数据不会很大,因为我只保留了通过条件 if 语句生成的数据,但我想迭代比当前 p1&2 和 r0 多的数字- 2.

这是while循环代码

start_time <- Sys.time()
p1<-2
p2<-2
r0<-25
r1<-4
r2<-0

TB<-c()
iter_count <- ihasNext(iproduct(ani1=(p1-2):(p1+2), ani2=(p2-2):(p2+2),
                      fd0=(r0-6):(r0+6), fd1=(r1-4):(r1+6), fd2=(r2):(r2+6)))

while( hasNext(iter_count) ) {
  ne <- nextElem(iter_count)
  aniprev <- sum(ne$ani1,ne$ani2)
  SRFD <- sum(ne$fd1,(2*ne$fd2))
  totalSRFD <- sum(ne$fd0,ne$fd1,ne$fd2)
  manhattan_dist<-sum(abs(p1-ne$ani1),abs(p2-ne$ani2),
                      abs(r0-ne$fd0),abs(r1-ne$fd1),abs(r2-ne$fd2))
  
  if(manhattan_dist <=5 & aniprev == SRFD & totalSRFD == 29)
  {ani<-cbind(ne$ani1, ne$ani2, ne$fd0,
               ne$fd1, ne$fd2, manhattan_dist)
  TB=rbind(TB,ani)}
}
nodup2 <- TB[!duplicated(t(apply(TB, 1, sort))), ]

end_time <- Sys.time()

end_time - start_time

这里是 foreach%dopar% 并行等价物

start_time <- Sys.time()
p1<-2
p2<-2
r0<-25
r1<-4
r2<-0

iter_count <- iproduct(ani1=(p1-2):(p1+2), ani2=(p2-2):(p2+2),
               fd0=(r0-6):(r0+6), fd1=(r1-4):(r1+6), fd2=(r2):(r2+6))

dc <- detectCores()-1
registerDoParallel(dc)

res <- foreach(i=iter_count, .combine=rbind) %dopar% {
aniprev <- sum(i$ani1,i$ani2)
SRFD <- sum(i$fd1,(2*i$fd2))
totalSRFD <- sum(i$fd0,i$fd1,i$fd2)
manhattan_dist<-sum(abs(p1-i$ani1),abs(p2-i$ani2),
                    abs(r0-i$fd0),abs(r1-i$fd1),abs(r2-i$fd2))

if(manhattan_dist <=5 & aniprev == SRFD & totalSRFD == 29)
{ani<-cbind(i$ani1, i$ani2, i$fd0,
            i$fd1, i$fd2, manhattan_dist)}
}
nodup2 <- res[!duplicated(t(apply(res, 1, sort))), ]

end_time <- Sys.time()

end_time - start_time

0 个答案:

没有答案