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

Posted

技术标签:

【中文标题】什么时候需要使用 sfExport(R Snowfall 包)【英文标题】:When do I need to use sfExport (R Snowfall package) 【发布时间】:2014-07-12 17:24:27 【问题描述】:

我正在使用降雪进行并行计算。我总是只在一台具有多个 CPU(> 20 个内核)的机器上。我正在处理大量数据(> 20gb)。 sfExport() 需要很长时间。

当我在笔记本电脑上运行测试代码并检查 CPU 使用率时,有时它也可以在没有 sfExport() 的情况下运行。

我的代码的某些部分是嵌套的 sfLapply() 函数。喜欢:

func2 <- function(c,d, ...)       

  result <- 
    list(x = c+d,
         y = ..,
         ...
         )

  return(result)



func1 <- function(x, a, b, c, ...) 

  library(snowfall)
  d <- a+b

  result <- sfLapply(as.list(b$row), func2, c, d, ...)

  return(result)


result <- sfLapply(as.list(data.table$row), func1, a, b, c, ..)

我什么时候真的需要将数据导出到所有 CPU?

感谢和最好的问候 妮可

【问题讨论】:

【参考方案1】:

如果您要将 20 GB 的对象导出到所有集群工作人员,这将花费大量时间并使用大量内存。每个工作人员都会收到自己的 20 GB 对象副本,因此您可能必须减少工作人员的数量以减少总内存使用量,否则您的机器可能会开始抖动并且您的程序最终可能会死掉。在这种情况下,使用更少的工人可能会运行得更快。当然,如果您的机器有 512 GB 的 RAM,使用 20 个工作人员可能没问题,尽管将对象发送给所有工作人员仍然需要很长时间。

如果每个 worker 需要一个特定的数据框或矩阵来执行 worker 函数,那么导出它可能是正确的做法。如果每个工作人员只需要对象的一部分,那么您应该将其拆分并只发送每个工作人员所需的部分。关键是要准确判断worker函数需要什么数据,只发送需要的数据。

如果一个对象似乎神奇地出现在工作人员身上,即使您没有导出它,您可能是在函数闭包中捕获该对象。这是一个例子:

library (snowfall)
sfInit (parallel=TRUE , cpus=4)
fun <- function() 
  x <- 100
  worker <- function(n) x * n
  sfLapply(1:1000, worker)

r <- fun()

这很好用,但变量“x”是如何发送给集群工作人员的并不明显。答案是当 sfLapply 将任务发送给 worker 时,“x”与“worker”函数一起序列化,因为“worker”是在函数“fun”中定义的。在这种情况下,通过 sfExport 向工作人员导出“x”是浪费时间。另请注意,尽管此技术适用于 sfLapply,但它不适用于 sfClusterApply 和 sfClusterApplyLB 等不执行任务分块的函数(如 sfLapply),尽管只有当“x”非常大时才会出现问题。

我不会再详细讨论这个主题,只是说当你的工作函数在另一个函数中定义时你应该非常小心。

【讨论】:

以上是关于什么时候需要使用 sfExport(R Snowfall 包)的主要内容,如果未能解决你的问题,请参考以下文章

什么时候需要参考 R 值?

OSError:隧道连接失败:需要 407 代理授权 - snowsql

高效完成R代码

R语言进行机器学习方法及实例

在 R 编程中使用 S4 方法啥时候有回报

使用 Azure 数据工厂将数据加载到雪花时出现问题