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】:

snowpackage 提供了apply() 的并行版本和相关功能。

【讨论】:

【参考方案3】:

如果您的输出可能被强制转换为原子向量,您可以使用unlist(mclapply(....))

【讨论】:

这不一定正确,因为您假设mclapply 的输出可以强制转换为原子向量,但情况并非总是如此。

以上是关于sapply 的并行版本的主要内容,如果未能解决你的问题,请参考以下文章

为啥并行和串行版本的执行时间几乎一样

基数排序的并行版本未按预期运行(Java)

如何同时使用 MKL 的并行和串行版本?

如何在CMake中配置可移植并行版本?

SVN多项目并行版本管理解决方案

c++多线程编程:实现标准库accumulate函数的并行计算版本