clusterApply
位於 parallel
包(package)。 說明
這些函數提供了多種使用集群並行計算的方法。
用法
clusterCall(cl = NULL, fun, ...)
clusterApply(cl = NULL, x, fun, ...)
clusterApplyLB(cl = NULL, x, fun, ...)
clusterEvalQ(cl = NULL, expr)
clusterExport(cl = NULL, varlist, envir = .GlobalEnv)
clusterMap(cl = NULL, fun, ..., MoreArgs = NULL, RECYCLE = TRUE,
SIMPLIFY = FALSE, USE.NAMES = TRUE,
.scheduling = c("static", "dynamic"))
clusterSplit(cl = NULL, seq)
parLapply(cl = NULL, X, fun, ..., chunk.size = NULL)
parSapply(cl = NULL, X, FUN, ..., simplify = TRUE,
USE.NAMES = TRUE, chunk.size = NULL)
parApply(cl = NULL, X, MARGIN, FUN, ..., chunk.size = NULL)
parRapply(cl = NULL, x, FUN, ..., chunk.size = NULL)
parCapply(cl = NULL, x, FUN, ..., chunk.size = NULL)
parLapplyLB(cl = NULL, X, fun, ..., chunk.size = NULL)
parSapplyLB(cl = NULL, X, FUN, ..., simplify = TRUE,
USE.NAMES = TRUE, chunk.size = NULL)
參數
cl |
由該包或包 |
fun, FUN |
函數或命名函數的字符串。 |
expr |
要評估的表達式。 |
seq |
要分割的向量。 |
varlist |
要導出的對象名稱的字符向量。 |
envir |
t 導出變量的環境 |
x |
|
... |
要傳遞給 |
MoreArgs |
|
RECYCLE |
邏輯性;如果 true 較短的參數被回收。 |
X |
|
chunk.size |
標量數;一個塊中 |
MARGIN |
指定要使用的維度的向量。 |
simplify, USE.NAMES |
邏輯性;請參閱 |
SIMPLIFY |
邏輯性;請參閱 |
.scheduling |
任務應該靜態分配給節點還是使用動態load-balancing? |
細節
clusterCall
在每個節點上使用相同的參數 ...
調用函數 fun
。
clusterEvalQ
在每個集群節點上計算文字表達式。它是 evalq
的並行版本,並且是調用 clusterCall
的便捷函數。
clusterApply
在第一個節點上使用參數 x[[1]]
和 ...
調用 fun
,在第二個節點上使用 x[[2]]
和 ...
調用,依此類推,根據需要回收節點。
clusterApplyLB
是 clusterApply
的負載均衡版本。如果x
的長度n
不大於節點數量p
,則將作業發送到n
節點。否則,第一個 p
作業將按順序放置在 p
節點上。當第一個作業完成後,下一個作業將被放置在已空閑的節點上;這一直持續到所有作業完成。與使用 clusterApply
相比,使用 clusterApplyLB
可以提高集群利用率,但增加通信會降低性能。此外,執行特定作業的節點是不確定的。這意味著將 RNG 流分配給節點的模擬將不可重現。
clusterMap
是 clusterApply
的 multi-argument 版本,類似於 mapply
和 Map
。如果 RECYCLE
為 true,則回收較短的參數(並且沒有一個或全部的長度必須為零);否則,結果長度是最短參數的長度。如果結果長度大於節點數,則回收節點。 ( mapply
始終使用 RECYCLE = TRUE
,並具有參數 SIMPLIFY = TRUE
。Map
始終使用 RECYCLE = TRUE
。)
clusterExport
在主機上分配值R中命名的變量的過程varlist
每個節點的全局環境(又名‘workspace’)中的同名變量。主控上導出變量的環境默認為全局環境。
clusterSplit
將 seq
拆分為每個集群的連續片段,並將結果作為長度等於節點數的列表返回。目前,這些片段被選擇為接近相等的長度:計算是在母版上完成的。
parLapply
,parSapply
, 和parApply
是並行版本lapply
,sapply
和apply
。使用以下方法將計算塊靜態分配給節點clusterApply
。默認情況下,塊的數量與節點的數量相同。parLapplyLB
,parSapplyLB
是load-balancing版本,供申請時使用FUN
到不同的元素X
花費的時間差異很大,並且函數或者是確定性的,或者不需要可重現的結果。使用以下方法將計算塊動態分配給節點clusterApplyLB
。從R3.5.0,默認的chunk數量是節點數量的兩倍。前R3.5.0 中,塊的(固定)數量與節點數量相同。至於clusterApplyLB
,通過負載平衡,執行特定作業的節點是不確定的,並且將 RNG 流分配給節點的模擬將不可重現。
parRapply
和 parCapply
是矩陣 x
的並行行和列 apply
函數;它們可能比 parApply
稍微高效一些,但對結果的處理較少 post-processing。
具有靜態調度的 0
塊大小使用默認值(每個節點一個塊)。通過動態調度,0
的塊大小與 1
具有相同的效果(每個塊調用一次 FUN
/fun
)。
值
對於 clusterCall
、 clusterEvalQ
和 clusterSplit
,每個節點一個元素的列表。
對於 clusterApply
和 clusterApplyLB
,與 x
長度相同的列表。
clusterMap
跟隨 mapply
。
clusterExport
不返回任何內容。
parLapply
返回長度為 X
的列表。
parSapply
和parApply
分別位於sapply
和apply
之後。
parRapply
和 parCapply
始終返回向量。如果 FUN
始終返回標量結果,則其長度將為行數或列數:否則它將是返回值的串聯。
如果任何工作程序產生錯誤,則主機上會發出錯誤信號。
注意
這些函數與 snow
包中的函數幾乎相同。
有兩個異常: parLapply
的參數為 X
而不是 x
,以與 lapply
保持一致,並且 parSapply
已更新為匹配 sapply
。
例子
## Use option cl.cores to choose an appropriate cluster size.
cl <- makeCluster(getOption("cl.cores", 2))
clusterApply(cl, 1:2, get("+"), 3)
xx <- 1
clusterExport(cl, "xx")
clusterCall(cl, function(y) xx + y, 2)
## Use clusterMap like an mapply example
clusterMap(cl, function(x, y) seq_len(x) + y,
c(a = 1, b = 2, c = 3), c(A = 10, B = 0, C = -10))
parSapply(cl, 1:20, get("+"), 3)
## A bootstrapping example, which can be done in many ways:
clusterEvalQ(cl, {
## set up each worker. Could also use clusterExport()
library(boot)
cd4.rg <- function(data, mle) MASS::mvrnorm(nrow(data), mle$m, mle$v)
cd4.mle <- list(m = colMeans(cd4), v = var(cd4))
NULL
})
res <- clusterEvalQ(cl, boot(cd4, corr, R = 100,
sim = "parametric", ran.gen = cd4.rg, mle = cd4.mle))
library(boot)
cd4.boot <- do.call(c, res)
boot.ci(cd4.boot, type = c("norm", "basic", "perc"),
conf = 0.9, h = atanh, hinv = tanh)
stopCluster(cl)
## or
library(boot)
run1 <- function(...) {
library(boot)
cd4.rg <- function(data, mle) MASS::mvrnorm(nrow(data), mle$m, mle$v)
cd4.mle <- list(m = colMeans(cd4), v = var(cd4))
boot(cd4, corr, R = 500, sim = "parametric",
ran.gen = cd4.rg, mle = cd4.mle)
}
cl <- makeCluster(mc <- getOption("cl.cores", 2))
## to make this reproducible
clusterSetRNGStream(cl, 123)
cd4.boot <- do.call(c, parLapply(cl, seq_len(mc), run1))
boot.ci(cd4.boot, type = c("norm", "basic", "perc"),
conf = 0.9, h = atanh, hinv = tanh)
stopCluster(cl)
作者
Luke Tierney and R Core.
Derived from the snow
package.
相關用法
- R children 用於管理分叉進程的低級函數
- R pvec 使用 Forking 並行化向量映射函數
- R makeCluster 創建並行套接字集群
- R RNGstreams Pierre L'Ecuyer 的 RngStreams 的實施
- R detectCores 檢測CPU核心數
- R mcparallel 在單獨的進程中異步計算 R 表達式
- R mcfork 分叉當前 R 進程的副本
- R mcaffinity 獲取或設置當前進程的CPU親和性掩碼
- R mclapply 使用 Forking 的 lapply 和 mapply 並行版本
- R splitIndices 劃分任務在集群中分布
- R SparkR partitionBy用法及代碼示例
- R purrr accumulate 累積向量縮減的中間結果
- R purrr imap 將函數應用於向量的每個元素及其索引
- R purrr list_transpose 轉置列表
- R purrr as_vector 將列表強製轉換為向量
- R purrr map_if 有條件地將函數應用於向量的每個元素
- R purrr map2 映射兩個輸入
- R purrr map_depth 在給定深度映射/修改元素
- R SparkR printSchema用法及代碼示例
- R purrr list_simplify 將列表簡化為原子或 S3 向量
- R purrr rerun 多次重新運行表達式
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Apply Operations using Clusters。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。