使用parallel或doParallel为多个OS作为CRAN包的自定义包

时间:2013-09-03 09:39:13

标签: r parallel-processing cran

我正在为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))

这是对的吗?

1 个答案:

答案 0 :(得分:11)

首先,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一样1}}。

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

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