2013-07-01 4 views
6

मैं वैश्विक वातावरण में परिभाषित नहीं किए गए किसी अन्य फ़ंक्शन के अंदर parLapply का उपयोग करने का प्रयास कर रहा हूं। कार्यकर्ता फ़ंक्शन अन्य फ़ंक्शंस की सूची का उपयोग करता है जो मैं पहले से clusterExport करना चाहता हूं, जो वैश्विक वातावरण में भी परिभाषित नहीं हैं। मेरी समस्या यह है कि दोनों कार्य क्लस्टर को अपने मूल्यांकन वातावरण निर्यात करते हैं, जो बहुत बड़े और आवश्यक नहीं हैं।क्लस्टर कैसे करें अपने मूल्यांकन वातावरण के बिना किसी फ़ंक्शन का निर्यात करें

हमें कार्यकर्ता फ़ंक्शन 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) <- .GlobalEnv सेट नहींं, तो functionList की भारी संलग्न पर्यावरण समूहों को निर्यात किया जाता है। वैश्विक पर्यावरण में functionList क्यों नहीं मिल सकता है?

उत्तर

10

एक पूर्ण उदाहरण के बिना समस्या का अनुमान लगाना मुश्किल है, लेकिन मुझे आश्चर्य है कि त्रुटि संदेश clusterExport से parLapply के बजाय नहीं आ रहा है। ऐसा होगा यदि functionList को वैश्विक पर्यावरण की बजाय किसी फ़ंक्शन में परिभाषित किया गया था, क्योंकि clusterExportenvir तर्क उस वातावरण को निर्दिष्ट करता है जिससे चर को निर्यात किया जाता है।

है कि एक ही समारोह से एक समारोह में परिभाषित चर निर्यात करने के लिए, आप का प्रयोग करेंगे:

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) 

ध्यान दें कि मैं अपने उदाहरण के साथ स्वतंत्रता लिया है, तो मुझे यकीन है कि यह कैसे अच्छी तरह से अपनी समस्या के साथ मेल खाती है नहीं कर रहा हूँ।

+0

बहुत बहुत धन्यवाद, क्लस्टर एक्सपोर्ट वास्तव में समस्या थी – Ronert

संबंधित मुद्दे