sapply 的并行版本
Posted
技术标签:
【中文标题】sapply 的并行版本【英文标题】:Parallel version of sapply 【发布时间】:2015-06-25 12:34:22 【问题描述】:我们是否有 ,因为我们在并行包中有 mclapply,它是 lapply 的一个版本。
【问题讨论】:
lapply 和 sapply 几乎是相同的功能,只是 sapply 简化了结果,所以 sapply 可以做什么 lapply 也可以,你只需要做一些后处理,即do.call("cbind", df)
或 @ 987654323@
你看起来像是 ***.com/questions/14759905/… 的骗子(至少在你标记了 data.table 的情况下;肯定还有一个通用的 R 并行化问题)
@grrgrrbla 谢谢,我想我可以使用 mclapply。
@Frank 谢谢,无论如何我得到了解决方案。
【参考方案1】:
正如@RHertel 指出的那样,snow
包具有应用系列选项,但它不计入mcsapply
功能,因为它被要求。如果您看一下sapply
的实现,它只是对lapply
的调用以及更多的后期处理:
sapply
#> function (X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)
#>
#> FUN <- match.fun(FUN)
#> answer <- lapply(X = X, FUN = FUN, ...)
#> if (USE.NAMES && is.character(X) && is.null(names(answer)))
#> names(answer) <- X
#> if (!isFALSE(simplify) && length(answer))
#> simplify2array(answer, higher = (simplify == "array"))
#> else answer
#>
#> <bytecode: 0x559a53feef18>
#> <environment: namespace:base>
由reprex package (v0.3.0) 于 2019 年 11 月 22 日创建
由于mclapply
函数等价于lapply
,您实际上可以自己编写替换sapply
的某些部分,这里是一个示例:
# An mc-version of the sapply function.
mcsapply <- function (X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)
FUN <- match.fun(FUN)
answer <- parallel::mclapply(X = X, FUN = FUN, ...)
if (USE.NAMES && is.character(X) && is.null(names(answer)))
names(answer) <- X
if (!isFALSE(simplify) && length(answer))
simplify2array(answer, higher = (simplify == "array"))
else answer
# Testing it out
library(parallel)
ans0 <- mcsapply(1:20, function(i) rnorm(1e4), mc.cores = 4)
ans1 <- sapply(1:20, function(i) rnorm(1e4))
# Same structure
str(ans0)
#> num [1:10000, 1:20] 0.1792 0.1581 -0.1293 -0.0324 0.1836 ...
str(ans1)
#> num [1:10000, 1:20] 1.304 1.355 -1.387 1.07 0.582 ...
由reprex package (v0.3.0) 于 2019 年 11 月 22 日创建
最后,您始终可以创建一个 Fork 集群并改用 parSapply
。
【讨论】:
【参考方案2】:snow
package 提供了apply()
的并行版本和相关功能。
【讨论】:
【参考方案3】:如果您的输出可能被强制转换为原子向量,您可以使用unlist(mclapply(....))
。
【讨论】:
这不一定正确,因为您假设mclapply
的输出可以强制转换为原子向量,但情况并非总是如此。以上是关于sapply 的并行版本的主要内容,如果未能解决你的问题,请参考以下文章