R Snowfall - 难以实现调用其他函数的函数
Posted
技术标签:
【中文标题】R Snowfall - 难以实现调用其他函数的函数【英文标题】:R Snowfall - Difficulty in implementing functions that call other functions 【发布时间】: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
我最终想用降雪来实现多维最小化问题的并行搜索程序,所以肯定需要能够从主并行函数调用函数。
有人可以帮忙吗?
【问题讨论】:
【参考方案1】:我不知道 snowfall 包的细节,但我知道在 R 中进行并行计算时,您需要假设您传递信息的每个内核都是一个全新的 R 实例。这意味着,无论您在注册集群之前通过主机传递了什么,您的克隆上都只有 R 的 vanilla 实例。
看起来有一个调用 sfExportAll() 会将你所有的全局变量放到克隆实例上。我会尝试一下,但我无法在我的 Windows 机器上运行降雪。
【讨论】:
【参考方案2】:您需要使用sfInit
和sfLapply
之间的sfExport
函数将f1
函数导出到worker:
sfExport('f1')
这是 snowfall
等效于 snow
clusterExport
函数。
要导出多个变量,您可以使用多个参数或list
参数:
sfExport('f1', 'x')
sfExport(list=c('f1', 'x'))
要导出全局环境中的所有变量,请使用sfExportAll
:
sfExportAll()
【讨论】:
完美...谢谢。而对于复杂的实现,大概 sfExportAll() 会起作用? @user2762408sfExportAll
如果您想导出全局环境中的所有内容,很方便,except
选项可用于排除不需要的变量。您也可以使用sfExport
导出多个变量,但您必须将它们全部命名。以上是关于R Snowfall - 难以实现调用其他函数的函数的主要内容,如果未能解决你的问题,请参考以下文章
Snowfall 的 sfApply 和 sfClusterApplyLB 比正常循环或 sapply 慢 [重复]
什么时候需要使用 sfExport(R Snowfall 包)
为集群上的所有节点开启所有 CPU:snow/snowfall 包