2012-04-10 18 views
22

मैं कई कोरों पर कोड चलाने की कोशिश कर रहा हूं (मैंने snow और parallel पैकेज दोनों की कोशिश की)। मैंवैश्विक वातावरण में ऑब्जेक्ट नहीं ढूंढ रहा है

cl <- makeCluster(2) 
y <- 1:10 
sapply(1:5, function(x) x + y) # Works 
parSapply(cl, 1:5, function(x) x + y) 

है अंतिम पंक्ति त्रुटि देता है:

Error in checkForRemoteErrors(val) : 
    2 nodes produced errors; first error: object 'y' not found 

जाहिर parSapply वैश्विक वातावरण में y नहीं मिल रहा है। इस के आसपास पाने के किसी भी तरीके? धन्यवाद।

उत्तर

20

नोड्स को मास्टर पर वैश्विक वातावरण में y के बारे में पता नहीं है। आपको उन्हें किसी भी तरह बताना होगा।

library(parallel) 
cl <- makeCluster(2) 
y <- 1:10 
# add y to function definition and parSapply call 
parSapply(cl, 1:5, function(x,y) x + y, y) 
# export y to the global environment of each node 
# then call your original code 
clusterExport(cl, "y") 
parSapply(cl, 1:5, function(x) x + y) 
5

यह उल्लेख है कि आपके उदाहरण है, हालांकि असली मुद्दा है, जहां समारोह function(x) x + y बनाई गई है parSapply एक समारोह के भीतर से कहा जाता है कि अगर काम करेंगे लायक है। उदाहरण के लिए, निम्नलिखित कोड सही ढंग से काम करता है:

library(parallel) 
fun <- function(cl, y) { 
    parSapply(cl, 1:5, function(x) x + y) 
} 
cl <- makeCluster(2) 
fun(cl, 1:10) 
stopCluster(cl) 

यह है, क्योंकि कार्यों अन्य कार्यों में बनाए जाते हैं कि स्थानीय वातावरण में वे बनाए गए थे के साथ क्रमानुसार लगे हुए हैं, जबकि वैश्विक वातावरण से बनाए गए कार्यों के साथ धारावाहिक नहीं कर रहे हैं वैश्विक पर्यावरण के साथ। यह कई बार उपयोगी हो सकता है, लेकिन यदि आप इस मुद्दे से अवगत नहीं हैं तो यह विभिन्न प्रकार की समस्याओं का कारण बन सकता है।

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