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