R中的函数中的并行化-避免将对象自动导出到群集中

问题描述 投票:0回答:1

在R中,我希望能够使用并行包创建psock集群,并避免(我认为设计很糟糕)行为,该行为会将函数中的所有对象自动导出到集群(从globalenv运行时,没有导出任何对象)。我希望能够通过对globalenv进行评估来做到这一点,但是正如您将在testfunc2()中看到的那样,这是行不通的。我想这样做是为了避免函数中不必要的序列化开销。在此测试功能中,所花费的时间可以忽略不计,我在有些应用中可以忽略不计。

我之前在这里问过一个相关的问题:R - terrible parallelisation performance within a function due to pointless serialization, how to improve?并且我在评论中发布的怪异技巧足以解决该问题,但我仍然认为/希望我现在要问的“应该”是可能的。

library(parallel)

#all works as expected in the global environment
bob <- 4
cl=makeCluster(2,type='PSOCK')
clusterCall(cl,function(x) bob) #error initially
clusterExport(cl,'bob')
clusterCall(cl,function(x) bob) #but fine after explicitly sending bob to cl
stopCluster(cl)
rm(bob)

#inside a function, parallelisation is madness
testfunc <- function(){
  bob <- 4
  cl=makeCluster(2,type='PSOCK')
  x <- clusterCall(cl,function(x) bob) #I want this to generate: Error: object 'bob' not found
  stopCluster(cl)
  return(x)
}

testfunc()

#tried evaluating in globalenv, setting cluster to globalenv, passing text string...
testfunc2 <- function(){
  bob <- 4
  cl=eval(makeCluster(2,type='PSOCK'),envir = globalenv())
  environment(cl) <- globalenv()
  x <- eval(clusterCall(cl,function(x) eval(parse(text='bob'))),envir = globalenv())
  stopCluster(cl)
  return(x)
}

testfunc2()
r parallel-processing environment
1个回答
0
投票

好吧,是我上面尝试的另一种变体:

testfunc3 <- function(doexport=FALSE){
  bob <- 4
  jane <- 7
  cl=makeCluster(2,type='PSOCK')
  if(doexport) clusterExport(cl,'bob',envir = environment())
  x <- clusterCall(cl,function(x) eval(parse(text='bob'),envir=globalenv()))
  x <- clusterCall(cl,function(x) eval(parse(text='jane'),envir=globalenv()))
  stopCluster(cl)
  return(x)
}

testfunc3()
testfunc3(TRUE) #now only errors on jane, which is not exported
© www.soinside.com 2019 - 2024. All rights reserved.