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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。
