7

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

想法?

另外,现在我正在parallel考虑

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

等价于doParallel's

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

那是对的吗?

4

1 回答 1

13

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

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

  • 只需使用parLapply,因为它适用于任何地方
  • parLapply在 Windows 和mclapply其他地方使用
  • doParallel与_foreach

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

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

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

请注意,如果您显式创建并注册了一个集群对象,那么无论平台如何,都不会mclapply被使用。它可以正常工作,但可能效率不高。要使用,您必须使用数字参数调用,或者根本不使用参数。mclapplyregisterDoParallel

您可以查看boot包的源代码,了解如何使用mclapplyparLapply取决于您的平台。

于 2013-09-03T14:03:59.797 回答