當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R clusterApply 使用集群應用操作


R語言 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

由該包或包 snow 創建的集群對象。如果是 NULL ,則使用注冊的默認集群。

fun, FUN

函數或命名函數的字符串。

expr

要評估的表達式。

seq

要分割的向量。

varlist

要導出的對象名稱的字符向量。

envir

t 導出變量的環境

x

clusterApplyclusterApplyLB 的向量, parRapplyparCapply 的矩陣。

...

要傳遞給 funFUN 的其他參數:注意與早期參數的部分匹配。

MoreArgs

fun 的附加參數。

RECYCLE

邏輯性;如果 true 較短的參數被回收。

X

parLapplyparSapply 的向量(原子或列表),parApply 的數組。

chunk.size

標量數;一個塊中 funFUN 的調用次數; chunk 是調度的單位。

MARGIN

指定要使用的維度的向量。

simplify, USE.NAMES

邏輯性;請參閱sapply

SIMPLIFY

邏輯性;請參閱mapply

.scheduling

任務應該靜態分配給節點還是使用動態load-balancing?

細節

clusterCall 在每個節點上使用相同的參數 ... 調用函數 fun

clusterEvalQ 在每個集群節點上計算文字表達式。它是 evalq 的並行版本,並且是調用 clusterCall 的便捷函數。

clusterApply 在第一個節點上使用參數 x[[1]]... 調用 fun ,在第二個節點上使用 x[[2]]... 調用,依此類推,根據需要回收節點。

clusterApplyLBclusterApply 的負載均衡版本。如果x的長度n不大於節點數量p,則將作業發送到n節點。否則,第一個 p 作業將按順序放置在 p 節點上。當第一個作業完成後,下一個作業將被放置在已空閑的節點上;這一直持續到所有作業完成。與使用 clusterApply 相比,使用 clusterApplyLB 可以提高集群利用率,但增加通信會降低性能。此外,執行特定作業的節點是不確定的。這意味著將 RNG 流分配給節點的模擬將不可重現。

clusterMapclusterApply 的 multi-argument 版本,類似於 mapplyMap 。如果 RECYCLE 為 true,則回收較短的參數(並且沒有一個或全部的長度必須為零);否則,結果長度是最短參數的長度。如果結果長度大於節點數,則回收節點。 ( mapply 始終使用 RECYCLE = TRUE ,並具有參數 SIMPLIFY = TRUEMap 始終使用 RECYCLE = TRUE 。)

clusterExport在主機上分配值R中命名的變量的過程varlist每個節點的全局環境(又名‘workspace’)中的同名變量。主控上導出變量的環境默認為全局環境。

clusterSplitseq 拆分為每個集群的連續片段,並將結果作為長度等於節點數的列表返回。目前,這些片段被選擇為接近相等的長度:計算是在母版上完成的。

parLapply,parSapply, 和parApply是並行版本lapply,sapplyapply。使用以下方法將計算塊靜態分配給節點clusterApply。默認情況下,塊的數量與節點的數量相同。parLapplyLB,parSapplyLB是load-balancing版本,供申請時使用FUN到不同的元素X花費的時間差異很大,並且函數或者是確定性的,或者不需要可重現的結果。使用以下方法將計算塊動態分配給節點clusterApplyLB。從R3.5.0,默認的chunk數量是節點數量的兩倍。前R3.5.0 中,塊的(固定)數量與節點數量相同。至於clusterApplyLB,通過負載平衡,執行特定作業的節點是不確定的,並且將 RNG 流分配給節點的模擬將不可重現。

parRapplyparCapply 是矩陣 x 的並行行和列 apply 函數;它們可能比 parApply 稍微高效一些,但對結果的處理較少 post-processing。

具有靜態調度的 0 塊大小使用默認值(每個節點一個塊)。通過動態調度,0 的塊大小與 1 具有相同的效果(每個塊調用一次 FUN /fun)。

對於 clusterCallclusterEvalQclusterSplit ,每個節點一個元素的列表。

對於 clusterApplyclusterApplyLB ,與 x 長度相同的列表。

clusterMap 跟隨 mapply

clusterExport 不返回任何內容。

parLapply 返回長度為 X 的列表。

parSapplyparApply分別位於sapplyapply之後。

parRapplyparCapply 始終返回向量。如果 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-devel大神的英文原創作品 Apply Operations using Clusters。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。