[英]How to write efficient nested functions for parallelization?
我有一個帶有兩個分組變量class
和group
的數據框。 對於每個班級,我每個小組都有一個繪圖任務。 大多數情況下,我必須每2級class
,每個500個級別group
。
我正在使用parallel
包進行並行化,並使用mclapply
函數通過class
和group
級別進行迭代。
我想知道哪種方法是編寫我的迭代的最佳方式。 我想我有兩個選擇:
class
變量運行並行化。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.