【问题标题】:Knowing what objects to clusterExport beforehand事先知道要 clusterExport 的对象
【发布时间】:2012-05-28 03:05:20
【问题描述】:

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

示例

我知道下面的示例不一定需要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""

如您所见,有一个错误提示找不到dmy 函数。然后我必须继续添加以下内容:

clusterExport(cl, c("dmy"))

所以我的问题是,除了查看错误以获取有关导出什么的线索之外,是否有一种更优雅的方法可以预先知道要导出哪些对象,或者是否有一种方法可以在运行之前与所有从属共享全局环境foreach?

【问题讨论】:

  • 有一个 .packages 参数。
  • 您介意详细说明一下吗?我试过 (.packages()) 它列出了附加的包。但是如何导出一个包的所有对象呢?我试过 clusterExport(cl, c("library(lubridate)")) 和 clusterExport(cl, c("lubridate")) 无济于事
  • 抱歉,我指的是 foreach.packages 参数,而不是 .packages 函数。
  • 哦,好的。我现在知道了。你想把它作为答案让我接受吗?

标签: r foreach parallel-processing


【解决方案1】:

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

【讨论】:

  • 这是否适用于 2.14.0 中的新并行库,例如parLapply?我也有类似的问题。
  • @mindless.panda:你应该可以使用clusterEvalQ(cl, library(packageName))在每个集群节点上加载包。
  • 谢谢,我还在 parLapply 的匿名函数中添加了一个 library(packagename)
猜你喜欢
  • 1970-01-01
  • 2021-01-11
  • 2018-07-28
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
相关资源
最近更新 更多