使用并行或 doParallel 为多个操作系统作为 CRAN 包的自定义包

Posted

技术标签:

【中文标题】使用并行或 doParallel 为多个操作系统作为 CRAN 包的自定义包【英文标题】:Custom package using parallel or doParallel for multiple OS as a CRAN package 【发布时间】:2013-09-03 09:39:13 【问题描述】:

我正在为 R 构建一个包,我希望它能够跨平台。我在Linux下开发,mclapply这个函数会用到parallel包中。 Windows(使用doParallel)不支持此包。我真的很喜欢parallel 包,因为它简单且速度快,我不知道这是否应该是为 CRAN 提供 2 个不同版本的包的原因,用于单独的操作系统(似乎需要额外的维护工作) ,更不用说是否允许了。

想法?

另外,现在我正在关注parallel

mclapply(ldata, function(x), mc.cores=cores)

相当于doParallel

cl <- makeCluster(cores)
parLapply(cl, ldata, function(x))

对吗?

【问题讨论】:

为什么不使用 parLapply 也来自 parallel 包,因为我相信这是跨平台的(或者我希望它是因为我在我的一个包中使用它)。您还可以使用 if()elseSys.info()["sysname"] 来使用正确的设置。 @Tyler Rinker,parLapply 是否显示每个新脚本的 .Rprofile 加载?如果是,那么我认为它应该是好的,因为它不是 fork。 parallel 在windows上支持,mclapply可以使用。它只是恢复为串行评估,就像一个简单的lapply @MartinMorgan 但不幸的是,这不是所需的后备行为...... 【参考方案1】:

首先,mclapplyparLapply 都在 parallel 包中,尽管 mclapply 实际上并没有在 Windows 上并行运行。 parLapply 在所有支持的平台上并行运行,但并不总是像 mclapply 那样高效。 doParallel 包与foreach 包一起使用,充当parallel 包的适配器。

要编写适用于 Windows 和非 Windows 的包,您有多种合理的选择:

只需使用parLapply,因为它适用于任何地方 在 Windows 上使用 parLapply,在其他地方使用 mclapply 使用doParallelforeach

doParallel 包很方便,因为它在非 Windows 平台上使用了mclapply。例如:

library(doParallel)
registerDoParallel()
foreach(i=1:10, .options.snow=list(preschedule=TRUE)) %dopar% 
    Sys.sleep(2)

这在 Linux 和 Mac OS X 上使用 mclapply,但会在 Windows 上自动在后台创建 PSOCK 集群对象。使用preschedule=TRUE(在doParallel 1.0.3 中添加)将导致doParallel 在内部预调度使用clusterApply 的任务,就像parLapply 一样。

请注意,如果您显式创建和注册集群对象,则无论平台如何,都将使用mclapply。它可以正常工作,但可能效率不高。要使用mclapply,您必须使用数字参数调用registerDoParallel,或者根本不使用参数。

您可以查看boot 包的源代码,了解如何根据您的平台使用mclapplyparLapply

【讨论】:

以上是关于使用并行或 doParallel 为多个操作系统作为 CRAN 包的自定义包的主要内容,如果未能解决你的问题,请参考以下文章

使用 doParallel 在 R 中并行化 keras 模型

插入符号训练二进制 glm 通过 doParallel 在并行集群上失败

R doParallel foreach 中的并行处理

在一组不同的解释变量上并行化 R 中的面板 logit 计算

并行化随机森林

RPostgreSQL 连接在使用 doParallel clusterEvalQ 启动后立即过期