R降雪 - 实现调用其他功能的功能的难度

时间:2013-09-09 18:36:25

标签: r parallel-processing snowfall

我正在尝试自学如何使用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

我最终希望使用降雪来实现多维最小化问题的并行化搜索过程,因此肯定需要能够从主并行化函数中调用函数。

任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:4)

您需要使用f1sfExport之间的sfInit功能将sfLapply功能导出给工作人员:

sfExport('f1')

这是与snowfall snow函数等效的clusterExport

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

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

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

sfExportAll()

答案 1 :(得分:0)

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

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