问题描述
对以下代码使用 while 循环 大约需要 20 秒。在没有集群的情况下使用 foreach 和 %dopar% 大约需要 25 秒,使用集群大约需要 28 秒。
我正在寻求澄清,因为我已经阅读了 here on stackoverflow 并行处理的小任务可能会变慢,但是当我增加 iproduct 中数字的 +/- 时并行处理仍然较慢。
这是因为;
- 我正在使用 iproduct 而应该使用不同的迭代器或
- iproduct 迭代的数据量需要大得多,并行化才有意义或
- 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$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),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$fd2,manhattan_dist)}
}
nodup2 <- res[!duplicated(t(apply(res,]
end_time <- Sys.time()
end_time - start_time
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)