【问题标题】:How to clusterExport a function without its evaluation environment如何在没有评估环境的情况下对函数进行集群导出
【发布时间】:2013-06-28 10:23:21
【问题描述】:

我正在尝试在全局环境中未定义的另一个函数中使用parLapply。 worker 函数使用了我想事先clusterExportother 函数列表,这些函数也没有在全局环境中定义。我的问题是这两个函数都将它们的评估环境导出到集群中,这些集群非常庞大且不需要。

让我们调用worker函数workerFunction和函数列表functionList

    workerFunction <- function(i) {
        intermediateOutput <- functionList[[i]](y)
        result <- otherCalculations(intermediateOutput)
        return(result)    
    }

    library(parallel)
    cl <- makeCluster(detectCores())
    environment(workerFunction) <- .GlobalEnv
    environment(functionList) <- .GlobalEnv
    clusterExport(cl, varlist=c("functionList", "y"), envir=.GlobalEnv)
    output <- parLapply(cl, inputVector, workerFunction)

我明白了:

Error in get(name, envir = envir) (from <text>#53) : object 'functionList' not found

如果我不设置environment(functionList) &lt;- .GlobalEnv,那么functionList 的巨大封闭环境将导出到集群。为什么R在全局环境中找不到functionList

【问题讨论】:

    标签: r parallel-processing environment-variables


    【解决方案1】:

    如果没有完整的示例,很难猜出问题所在,但我想知道错误消息是否来自clusterExport,而不是来自parLapply。如果functionList 是在函数而不是全局环境中定义的,就会发生这种情况,因为clusterExport envir 参数指定了从中导出变量的环境。

    要从同一个函数中导​​出函数中定义的变量,您可以使用:

    clusterExport(cl, varlist=c("functionList", "y"), envir=environment())
    

    我只是猜测这对您来说可能是个问题,因为我不知道您如何或在何处定义 functionList。请注意,clusterExport 始终将变量分配给集群工作人员的全局环境。

    我也怀疑您显然设置列表环境的方式:这似乎是合法的,但我认为它不会改变该列表中函数的环境。事实上,我怀疑将函数导出到列表中的工作人员可能还有其他您尚未遇到的问题。我会使用这样的东西:

    mainFunction <- function(cl) {
        fa <- function(x) fb(x)
        fb <- function(x) fc(x)
        fc <- function(x) x
        y <- 7
        workerFunction <- function(i) {
            do.call(functionNames[[i]], list(y))
        }
        environment(workerFunction) <- .GlobalEnv
        environment(fa) <- .GlobalEnv
        environment(fb) <- .GlobalEnv
        environment(fc) <- .GlobalEnv
        functionNames <- c("fa", "fb", "fc")
        clusterExport(cl, varlist=c("functionNames", functionNames, "y"),
                      envir=environment())
        parLapply(cl, seq_along(functionNames), workerFunction)
    }
    
    library(parallel)
    cl <- makeCluster(detectCores())
    mainFunction(cl)
    stopCluster(cl)
    

    请注意,我对您的示例有所冒犯,因此我不确定这与您的问题是否相符。

    【讨论】:

    • 非常感谢,clusterExport 确实是问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    相关资源
    最近更新 更多