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


R pvec 使用 Forking 并行化向量映射函数


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

调用向量每个部分的函数

...

向量之后传递给 FUN 的任何其他参数

mc.set.seed

请参阅mcparallel

mc.silent

如果设置为TRUE然后所有输出都在‘标准输出' 对于所有分叉的并行进程将被抑制('标准错误’不受影响)。

mc.cores

要使用的核心数量,即最多同时运行多少个子进程。必须至少为 1 个,并行运行时至少为 2 个。该选项是从环境变量初始化的MC_CORES如果设置。

mc.cleanup

请参阅 mclapply 中对此参数的说明。

细节

pvec 并行化 FUN(x, ...),其中 FUN 是一个返回与 x 长度相同的向量的函数。 FUN 也必须是纯的(即没有 side-effects),因为 side-effects 不是从并行进程中收集的。该向量被分成几乎相同大小的子向量,FUN 在其上运行。尽管原则上可以使用不一定是映射的函数,但解释为case-specific,因为理论上分割是任意的(在这种情况下会给出警告)。

pvecmclapply 之间的主要区别在于,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.

也可以看看

mcparallelmclapplyparLapplyclusterMap

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Parallelize a Vector Map Function using Forking。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。