使用并行或 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()else
和 Sys.info()["sysname"]
来使用正确的设置。
@Tyler Rinker,parLapply 是否显示每个新脚本的 .Rprofile 加载?如果是,那么我认为它应该是好的,因为它不是 fork。
parallel
是在windows上支持,mclapply
可以使用。它只是恢复为串行评估,就像一个简单的lapply
。
@MartinMorgan 但不幸的是,这不是所需的后备行为......
【参考方案1】:
首先,mclapply
和 parLapply
都在 parallel
包中,尽管 mclapply
实际上并没有在 Windows 上并行运行。 parLapply
在所有支持的平台上并行运行,但并不总是像 mclapply
那样高效。 doParallel
包与foreach
包一起使用,充当parallel
包的适配器。
要编写适用于 Windows 和非 Windows 的包,您有多种合理的选择:
只需使用parLapply
,因为它适用于任何地方
在 Windows 上使用 parLapply
,在其他地方使用 mclapply
使用doParallel
和foreach
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
包的源代码,了解如何根据您的平台使用mclapply
或parLapply
。
【讨论】:
以上是关于使用并行或 doParallel 为多个操作系统作为 CRAN 包的自定义包的主要内容,如果未能解决你的问题,请参考以下文章
使用 doParallel 在 R 中并行化 keras 模型
插入符号训练二进制 glm 通过 doParallel 在并行集群上失败