簡體   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