我正在尝试自学如何使用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
我最终希望使用降雪来实现多维最小化问题的并行化搜索过程,因此肯定需要能够从主并行化函数中调用函数。
任何人都可以帮忙吗?
答案 0 :(得分:4)
您需要使用f1
和sfExport
之间的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机器上运行降雪。