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