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】:

您需要使用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 导出多个变量,但您必须将它们全部命名。

以上是关于R Snowfall - 难以实现调用其他函数的函数的主要内容,如果未能解决你的问题,请参考以下文章

Snowfall 的 sfApply 和 sfClusterApplyLB 比正常循环或 sapply 慢 [重复]

什么时候需要使用 sfExport(R Snowfall 包)

gdb:在多线程程序中调用函数而不进行线程

为集群上的所有节点开启所有 CPU:snow/snowfall 包

利用snowfall.jquery.js实现满屏爱心表白代码

R降雪环境问题