繁体   English   中英

当应用于 df[i,] 中的 dataframe 时,foreach %dopar% 实际在做什么

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM