我正在使用降雪进行并行计算。我始终只在一台具有多个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?
谢谢,最好的问候尼科
如果要将20 gb对象导出到所有群集工作程序,则将花费大量时间并使用大量内存。每个工作人员将收到该20 GB对象的副本,因此您可能必须减少工作人员的数量以减少总内存使用量,否则您的计算机可能开始崩溃,程序最终可能死机。在这种情况下,使用更少的工人可能会更快。当然,如果您的计算机具有512 gb的RAM,则使用20个工作程序可能会很好,尽管将对象发送给所有工作程序仍需要很长时间。
如果每个工作人员都需要特定的数据帧或矩阵来执行工作人员功能,则导出它可能是正确的选择。如果每个工作人员仅需要对象的一部分,则应将其拆分,并仅发送每个工作人员所需的部分。关键是确切确定工作函数需要哪些数据,然后仅发送所需的数据。
如果即使您不导出对象,似乎该对象仍在魔术师面前出现,则可能是在函数闭包中捕获了该对象。这是一个例子:
library (snowfall)
sfInit (parallel=TRUE , cpus=4)
fun <- function() {
x <- 100
worker <- function(n) x * n
sfLapply(1:1000, worker)
}
r <- fun()
这可以正常工作,但是将变量“ x”发送到集群工作程序的方式并不明显。答案是当sfLapply将任务发送给工作人员时,“ x”与“工作人员”功能一起被序列化,因为“工作人员”是在函数“ fun”中定义的。在这种情况下,通过sfExport将“ x”导出到工人是浪费时间。还要注意,尽管该技术在sfLapply上效果很好,但在诸如sfClusterApply和sfClusterApplyLB之类的函数中却无法很好地发挥作用,但这些函数不会像sfLapply那样执行任务分块,尽管“ x”很大时,这只是一个问题。
除了要说您的辅助函数在另一个函数中定义时要格外小心,我将不再对此主题进行详细介绍。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句