簡體   English   中英

如何為並行化編寫高效的嵌套函數?

[英]How to write efficient nested functions for parallelization?

我有一個帶有兩個分組變量classgroup的數據框。 對於每個班級,我每個小組都有一個繪圖任務。 大多數情況下,我必須每2級class每個500個級別group

我正在使用parallel包進行並行化,並使用mclapply函數通過classgroup級別進行迭代。

我想知道哪種方法是編寫我的迭代的最佳方式。 我想我有兩個選擇:

  1. class變量運行並行化。
  2. group變量運行並行化。

我的計算機有 3 個內核用於 R 會話,通常為我的操作系統保留第 4 個內核。 我想知道如果對具有 2 個級別的class變量執行並行化,將永遠不會使用第 3 個核心,所以我認為確保所有 3 個核心都將運行group變量的並行化會更有效。 我已經編寫了一些速度測試,以確保這是最好的方法:

library(microbenchmark)
library(parallel)

f = function(class, group, A, B) {

  mclapply(seq(class), mc.cores = A, function(z) {
    mclapply(seq(group), mc.cores = B, function(c) {
      ifelse(class == 1, 'plotA', 'plotB')
    })
  })

}

class = 2
group = 500

microbenchmark(
  up = f(class, group, 3, 1),
  nest = f(class, group, 1, 3),
  times = 50L
)

Unit: milliseconds
 expr       min        lq     mean    median       uq      max neval
   up  6.751193  7.897118 10.89985  9.769894 12.26880 26.87811    50
 nest 16.584382 18.999863 25.54437 22.293591 28.60268 63.49878    50

結果告訴我應該對class而不是group變量使用並行化。

概述是我總是應該編寫單核函數,然后調用它進行並行化。 我認為這樣,我的代碼會比編寫具有並行化功能的嵌套函數更簡單或更簡化。

使用ifelse條件是因為之前用於准備繪圖任務數據的代碼對於兩個class級別或多或少都是多余的,所以我認為編寫一個更長的函數來檢查使用哪個class級別比“將此功能拆分為兩個較短的功能。

編寫這種代碼的最佳做法是什么? 我很清楚,但因為我不是專業的數據科學家,我想知道你的工作方法。

這個威脅是圍繞這個問題的。 但我認為我的問題是針對兩種觀點的:

  • 代碼美觀清晰
  • 速度表現

謝謝

你剛才問過這個問題,但我會嘗試回答,以防其他人想知道同樣的事情。 首先,我喜歡先拆分我的任務,然后循環遍歷每個部分。 這讓我可以更好地控制這個過程。

parts <- split(df, c(df$class, df$group))
mclapply(parts, some_function)

其次,將任務分配到多個核心需要大量的計算開銷,並且會抵消您從並行化腳本中獲得的任何收益。 在這里, mclapply將作業拆分為您擁有的mclapply多個節點並執行一次分叉。 這比嵌套兩個mclapply循環更有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM