事先了解clusterExport的对象

RJ-*_*RJ- 7 parallel-processing foreach r

我是新手使用并行软件包并开始探索它们以加快我的一些工作.我经常遇到的烦恼是,foreach当我没有clusterExport相关的函数/变量时,命令会抛出问题.

我知道下面的例子并不一定foreach要让它快速,但为了便于说明,我将使用它.

library(doParallel)
library(parallel)
library(lubridate)
library(foreach)

cl <- makeCluster(c("localhost", "localhost", "localhost","localhost"), type = "SOCK")
registerDoParallel(cl, cores = 4)

Dates <- sample(c(dates = format(seq(ISOdate(2010,1,1), by='day', length=365), format='%d-%m-%Y')), 500, replace = TRUE)

foreach(i = seq_along(Dates), .combine = rbind) %dopar% dmy(Dates[i])

Error in dmy(Dates[i]) : task 1 failed - "could not find function "dmy""
Run Code Online (Sandbox Code Playgroud)

如您所见,有一个错误表明dmy找不到该功能.然后我必须继续添加以下内容:

clusterExport(cl, c("dmy"))
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,除了查看错误以寻找导出内容的线索之外,是否有一种更优雅的方式可以事先知道要导出哪些对象,或者有没有办法在运行之前与所有从属设备共享全局环境foreach

Jos*_*ich 2

无需像这样手动导出单个包函数。您可以使用函数.packages的参数foreach来加载所需的包,因此所有包函数都可用于您的%dopar%表达式。

  • @mindless.panda:您应该能够使用 clusterEvalQ(cl, library(packageName)) 在每个集群节点上加载包。 (2认同)