[英]What is foreach %dopar% actually doing when applied to a dataframe as in df[i,]
我想我完全误解了 foreach 并行操作是如何工作的。
在以下示例中,foreach 为不同的i
值运行foo(DF[i,])
的 7 个独立线程,这些线程相互跳跃以获得下一个可用行? 将foo(DF[i,])
的计算拆分为 7 个线程之间的单个i
值? 或者它是否为相同的i
值复制了foo(DF[i,])
的相同操作 7 次?
另外:是否有可能完成类似于第一种情况的事情,其中几个独立线程以一种并行序列化的方法共同迭代 dataframe 的行(或行块)? 还是唯一的选择是提前子集化并将每个子集分配给一个单独的线程?
registerDoParallel(7) ##4 physical cores, 8 logical cores
foreach(
i=seq(nrow(DF),
),
.packages= c("data.table","tidyverse")
) %dopar%
foo(DF[i,])
这就像拥有 7 个DF
副本,并且i
的迭代被分成不同的核心。 因此,核心 1 将对DF
的第一个副本执行 i=1 ,核心 2 将对第二个副本执行 i=2 。 当一个核心完成第一次迭代时,它将使用自己的DF
副本计算 i=8 。
你可以看看发生了什么使用例如
library(foreach)
library(doParallel)
tmp <- tempfile()
cl <- makeCluster(7, outfile = tmp)
registerDoParallel(cl) ##4 physical cores, 8 logical cores
DF <- iris[-5]
foreach(i = seq(nrow(DF)), .combine = "c") %dopar% {
cat("Processing i =", i, "with PID", Sys.getpid(), "\n")
sum(DF[i, ])
}
readLines(tmp)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.