【问题标题】:R Snowfall - Difficulty in implementing functions that call other functionsR Snowfall - 难以实现调用其他函数的函数
【发布时间】:2013-09-13 07:46:03
【问题描述】:

我正在尝试自学如何使用 Snowfall 包,当我尝试调用第二个函数的函数时遇到了以下问题(这是我最终想要实现的简化用例)。

我目前有:

library (snowfall)
f1 <- function(n) { return (n-1) }
f2 <- function(n) { return (f1(n)^2) }
# initialize cluster
sfInit (parallel=TRUE , cpus=4)
# parallel computing
result <- sfLapply(1:10, f2)
# stop cluster
sfStop ()

但我收到错误消息:

Error in checkForRemoteErrors(val) :
  4 nodes produced errors; first error: could not find function "f1"

但是,如果我随后运行 lapply(1:10, f2) 我会收到以下输出:

lapply(1:10, f2)
[[1]]
[1] 0

[[2]]
[1] 1

[[3]]
[1] 4

[[4]]
[1] 9

[[5]]
[1] 16

[[6]]
[1] 25

[[7]]
[1] 36

[[8]]
[1] 49

[[9]]
[1] 64

[[10]]
[1] 81

我最终想用降雪来实现多维最小化问题的并行搜索程序,所以肯定需要能够从主并行函数调用函数。

有人可以帮忙吗?

【问题讨论】:

    标签: r parallel-processing snowfall


    【解决方案1】:

    我不知道 snowfall 包的细节,但我知道在 R 中进行并行计算时,您需要假设您传递信息的每个内核都是一个全新的 R 实例。这意味着,无论您在注册集群之前通过主机传递了什么,您的克隆上都只有 R 的 vanilla 实例。

    看起来有一个调用 sfExportAll() 会将你所有的全局变量放到克隆实例上。我会尝试一下,但我无法在我的 Windows 机器上运行降雪。

    【讨论】:

      【解决方案2】:

      您需要使用sfInitsfLapply 之间的sfExport 函数将f1 函数导出到worker:

      sfExport('f1')
      

      这是 snowfall 等效于 snow clusterExport 函数。

      要导出多个变量,您可以使用多个参数或list 参数:

      sfExport('f1', 'x')
      sfExport(list=c('f1', 'x'))
      

      要导出全局环境中的所有变量,请使用sfExportAll

      sfExportAll()
      

      【讨论】:

      • 完美...谢谢。而对于复杂的实现,大概 sfExportAll() 会起作用?
      • @user2762408 sfExportAll 如果您想导出全局环境中的所有内容,很方便,except 选项可用于排除不需要的变量。您也可以使用sfExport 导出多个变量,但您必须将它们全部命名。
      猜你喜欢
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 2018-06-09
      • 1970-01-01
      • 2017-01-15
      相关资源
      最近更新 更多