R語言中for循環的並行處理


前言

本文用於記錄筆者在將R語言中的for語句並行化處理中的一些問題。

實驗

這里使用foreach和doParallel包提供的函數實現for語句的並行處理。

for語句腳本

func <- function(x, y, z) {
  return(x^y/z)
}

# >>> main <<<
x <- 2
y <- 3
z <- 1:100000

start <- (proc.time())[3][[1]]
a <- 0
for (i_z in z) {
  a <- a + func(x, y, i_z)
}
end <- (proc.time())[3][[1]]
print(paste('Result = ', round(a, 2), ', time = ', (end-start), 's', sep=''))

輸出:

[1] "Result = 96.72, time = 0.177s"

並行化版本

library(foreach)
library(doParallel)

func <- function(x, y, z) {
  return(x^y/z)
}

# >>> main <<<
x <- 2
y <- 3
z <- 1:100000

start <- (proc.time())[3][[1]]
cl <- makeCluster(12)
registerDoParallel(cl)
a <- foreach(z=z, .combine='rbind') %dopar% func(x, y, z)
a <- sum(a)
stopCluster(cl)
end <- (proc.time())[3][[1]]
print(paste('Result = ', round(a, 2), ', time = ', (end-start), 's', sep=''))

輸出:

[1] "Result = 96.72, time = 37.988s"

總結

  1. 這里發現並行化所用時間大於非並行化所用過的時間,是因為需要執行的操作(func函數)過於簡單,而foreach處理時會有額外的資源消耗。此時foreach額外消耗的資源遠大於需要執行的操作所需的資源,因此會導致並行化后反而使用的時間增加了。所以對於一些復雜的操作比較適合使用並行化的策略。

  2. foreach函數的.packages參數可以為並行化函數傳遞額外需要的包。

  3. foreach中的參數為需要在func中循環的變量,其他固定的變量則在func中傳入。參數可以是data.frame類型。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM