pvec
位于 parallel
包(package)。 说明
pvec
通过分割向量并将每个部分提交给一个核心,在向量元素上并行执行函数。该函数必须是矢量化映射,即它接受矢量输入并创建与输入完全相同长度的矢量输出,该输出不依赖于矢量的划分。
它依赖于分叉,因此在 Windows 上不可用,除非 mc.cores = 1
。
用法
pvec(v, FUN, ..., mc.set.seed = TRUE, mc.silent = FALSE,
mc.cores = getOption("mc.cores", 2L), mc.cleanup = TRUE)
参数
v |
要操作的向量 |
FUN |
调用向量每个部分的函数 |
... |
向量之后传递给 |
mc.set.seed |
请参阅 |
mc.silent |
如果设置为 |
mc.cores |
要使用的核心数量,即最多同时运行多少个子进程。必须至少为 1 个,并行运行时至少为 2 个。该选项是从环境变量初始化的MC_CORES如果设置。 |
mc.cleanup |
请参阅 |
细节
pvec
并行化 FUN(x, ...)
,其中 FUN
是一个返回与 x
长度相同的向量的函数。 FUN
也必须是纯的(即没有 side-effects),因为 side-effects 不是从并行进程中收集的。该向量被分成几乎相同大小的子向量,FUN
在其上运行。尽管原则上可以使用不一定是映射的函数,但解释为case-specific,因为理论上分割是任意的(在这种情况下会给出警告)。
pvec
和 mclapply
之间的主要区别在于,mclapply
将分别在每个元素上运行 FUN
,而 pvec
假定 c(FUN(x[1]), FUN(x[2]))
等效于 FUN(x[1:2])
,因此将分为对 FUN
,因为有多个核心(或元素,如果较少),每个核心处理一个子集向量。这使得它比 mclapply
更高效,但需要对 FUN
进行上述假设。
如果mc.cores == 1
,则在当前进程中评估FUN(v, ...)
。
值
计算结果 - 在成功的情况下,它应该与 v
具有相同的长度。如果发生错误或函数不是映射,则结果可能会更短或更长,并发出警告。
注意
由于并行化的性质,错误处理不遵循通常的规则,因为错误将以字符串形式返回,而被杀死的子进程的结果将简单地显示为不存在的数据。因此,用户有责任检查结果的长度以确保其大小正确。如果是这种情况,pvec
会发出警告,因为它不知道这样的结果是否是有意的。
请参阅mcfork
,了解不建议将其与 GUI front-ends 和多线程库一起使用。
例子
x <- pvec(1:1000, sqrt)
stopifnot(all(x == sqrt(1:1000)))
# One use is to convert date strings to unix time in large datasets
# as that is a relatively slow operation.
# So let's get some random dates first
# (A small test only with 2 cores: set options("mc.cores")
# and increase N for a larger-scale test.)
N <- 1e5
dates <- sprintf('%04d-%02d-%02d', as.integer(2000+rnorm(N)),
as.integer(runif(N, 1, 12)), as.integer(runif(N, 1, 28)))
system.time(a <- as.POSIXct(dates))
# But specifying the format is faster
system.time(a <- as.POSIXct(dates, format = "%Y-%m-%d"))
# pvec ought to be faster, but system overhead can be high
system.time(b <- pvec(dates, as.POSIXct, format = "%Y-%m-%d"))
stopifnot(all(a == b))
# using mclapply for this would much slower because each value
# will require a separate call to as.POSIXct()
# as lapply(dates, as.POSIXct) does
system.time(c <- unlist(mclapply(dates, as.POSIXct, format = "%Y-%m-%d")))
stopifnot(all(a == c))
作者
Simon Urbanek and R Core.
Derived from the multicore
package formerly on CRAN.
也可以看看
相关用法
- R children 用于管理分叉进程的低级函数
- R makeCluster 创建并行套接字集群
- R clusterApply 使用集群应用操作
- 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大神的英文原创作品 Parallelize a Vector Map Function using Forking。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。