当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。