2011-07-24 12 views
7

के साथ काम नहीं करता है, डिस्क में ऑब्जेक्ट्स को स्मृति में लोड करते समय मुझे foreach% dopar% का उपयोग करने के साथ कुछ समस्याएं आईं ... ऑब्जेक्ट लोड नहीं होते हैं जब मैं foreach% dopar% का उपयोग करते समय उन्हें लोड करने का प्रयास करता हूं (यह तब काम करता है जब मैं केवल% do% का उपयोग करता हूं) नीचे एक साधारण उदाहरण है जो मेरी समस्या दिखाता है।लोड फ़ोरैच और% डोपर%

envir = .GlobalEnv 

x <- "X test" 
y <- "Y test" 
z <- "Z test" 

save(x, file="x.RData") 
save(y, file="y.RData") 
save(z, file="z.RData") 

rm(x) 
rm(y) 
rm(z) 

objectsNamesVector <- c("x", "y", "z") 

foreach(i=1:length(objectsNamesVector), .combine=function (...) NULL, .multicombine=TRUE) %do% { 
    print(paste("Loading object ", objectsNamesVector[i]," - ", i, " of ", length(objectsNamesVector), sep="")) 
    load(file=paste(objectsNamesVector[i], ".RData", sep=""), envir=envir) 
} 

print(x) 
print(y) 
print(z) 

rm(x) 
rm(y) 
rm(z) 

foreach(i=1:length(objectsNamesVector), .combine=function (...) NULL, .multicombine=TRUE) %dopar% { 
    print(paste("Loading object ", objectsNamesVector[i]," - ", i, " of ", length(objectsNamesVector), sep="")) 
    load(file=paste(objectsNamesVector[i], ".RData", sep=""), envir=envir) 
} 

print(x) 
print(y) 
print(z) 

इस कोड को क्रियान्वित करने का परिणाम (बिना ">") है:

envir = .GlobalEnv 

x <- "X test" 
y <- "Y test" 
z <- "Z test" 

save(x, file="x.RData") 
save(y, file="y.RData") 
save(z, file="z.RData") 

rm(x) 
rm(y) 
rm(z) 

objectsNamesVector <- c("x", "y", "z") 

foreach(i=1:length(objectsNamesVector), .combine=function (...) NULL, .multicombine=TRUE) %do% { 
+ print(paste("Loading object ", objectsNamesVector[i]," - ", i, " of ", length(objectsNamesVector), sep="")) 
+ load(file=paste(objectsNamesVector[i], ".RData", sep=""), envir=envir) 
+ } 
[1] "Loading object x - 1 of 3" 
[1] "Loading object y - 2 of 3" 
[1] "Loading object z - 3 of 3" 
NULL 

print(x) 
[1] "X test" 
print(y) 
[1] "Y test" 
print(z) 
[1] "Z test" 
rm(x) 
rm(y) 
rm(z) 

foreach(i=1:length(objectsNamesVector), .combine=function (...) NULL, .multicombine=TRUE) %dopar% { 
+ print(paste("Loading object ", objectsNamesVector[i]," - ", i, " of ", length(objectsNamesVector), sep="")) 
+ load(file=paste(objectsNamesVector[i], ".RData", sep=""), envir=envir) 
+ } 
NULL 

print(x) 
Error in print(x) : object 'x' not found 
print(y) 
Error in print(y) : object 'y' not found 
print(z) 
Error in print(z) : object 'z' not found 

मैं समझता हूँ कि मैं foreach साथ आईओ में सुधार नहीं कर सकते हैं के बाद से आईओ मेरी वास्तुकला पर अनुक्रमिक है। मैं सिर्फ यह समझना चाहूंगा कि यह क्यों काम नहीं कर रहा है ...

आपके उत्तर के लिए धन्यवाद।

सम्मान, समो।

+0

तो, मुझे लगता है कि यह है। क्या कोई सलाह दे सकती है कि आर-हेल्प सूची में मुझे कोई जवाब प्राप्त करने के लिए इस प्रश्न को पोस्ट करना चाहिए? Thnx। – user859821

उत्तर

2

मुझे विश्वास है कि समस्या यह है कि %do% वैश्विक पर्यावरण को लिखने में सक्षम है, जबकि %dopar% नहीं है। का उपयोग करना बहुत उपयोगी है यदि आप foreach() सिंटैक्स और अन्य उपहार चाहते हैं, लेकिन समानांतर बैकएंड की आवश्यकता नहीं है।

साथ ही, %do% अनुक्रम में किया जाता है, वैश्विक पर्यावरण को साफ रखने के लिए उपयोगकर्ता को छोड़ दिया जा सकता है, क्योंकि दौड़ की स्थिति नहीं होगी। समानांतर मामले में, आपके पास दौड़ की स्थिति हो सकती है (यानी कुछ समांतर कार्य दूसरों के सामने समाप्त हो सकते हैं, और यादृच्छिक, कठोर-से-पुनरुत्पादित परिणाम बना सकते हैं)।

दौड़ की स्थिति के कारण, यह अच्छा विचार नहीं है कि इस तरह के ऑपरेशन सीधे वैश्विक पर्यावरण को लिखें, यदि आप इससे बच सकते हैं। बाद में उपयोगकर्ता ऐसे क्रमिक कोड ले सकता है और %do% को %dopar% के साथ प्रतिस्थापित कर सकता है, जो तेजी से परिणाम प्राप्त करने की उम्मीद कर रहा है, लेकिन एक ही परिणाम नहीं प्राप्त कर सकता है। आपके क्रेडिट के लिए, आपको यह पता चल गया है कि यह कहां हो सकता है।

+0

धन्यवाद। मैंने समझने के बिना% डोपर% का उपयोग करना शुरू किया कि वास्तव में आर में समानांतर बैकएंड कैसे काम करता है, इसलिए मेरी गलतफहमी। – user859821

2

यह बताने के लिए वास्तव में क्या जानने के बिना हो रहा है मुश्किल है:

  1. आपके ऑपरेटिंग सिस्टम है क्या।
  2. क्या समानांतर बैकएंड आप% dopar%

को पंजीकृत कर लिया है आप doMC उपयोग कर रहे हैं, तो foreach ब्लॉक के भीतर कोड कांटा() 'एड प्रक्रिया के भीतर निष्पादित करता है। इसका मतलब है कि इसकी अपनी मेमोरी स्पेस है, और जब यह स्थानीय रूप से webobalEnv को संशोधित करेगी, तो यह इसे "मास्टर" प्रक्रिया में संशोधित नहीं करेगी। यही है, आप webobalEnv की एक प्रति संशोधित करना समाप्त कर देते हैं।

यदि आप इस कोड को पंजीकृत बैकएंड के साथ निष्पादित करते हैं, तो यह "सही ढंग से" निष्पादित करता है, क्योंकि% dopar%% d% के रूप में निष्पादित हो जाता है।

इस स्थिति को संभालने का एक तरीका नए वातावरण में वस्तुओं को लोड करना हो सकता है, और फिर उनमें से प्रत्येक की सामग्री को GlobalobalEnv में कॉपी करने के लिए foreach() के .combine पैरामीटर का उपयोग करें।

+0

आपकी व्याख्या के लिए धन्यवाद। अब मैं समझता हूं कि दृश्यों के पीछे क्या चल रहा है। – user859821

1

मुझे एक ही समस्या थी जब मैंने 32 कोर कंप्यूटर पर समानांतर प्रोग्राम चलाने के लिए "foreach" + "doSnow" का उपयोग करने का प्रयास किया था। "foreach" काम करना बंद कर दिया और कहा: एक उद्देश्य नहीं मिला! मैंने बाहरी वस्तु को शामिल करने के लिए "foreach" में ".export" का उपयोग किया था, लेकिन यह अभी भी कहा गया है कि ऑब्जेक्ट नहीं मिला! जब मैंने कोशिश की "doParallel" नहीं "donow", यह काम किया!

external_object < - 1

पुस्तकालय (foreach)
पुस्तकालय (doParallel)
registerDoParallel (कोर = 32)
getDoParWorkers()

foreach (i = 1: 32, .combine = सी। multicombine = TRUE, .export = c ("external_object"))% dopar% { बाहरी_ोबजेक्ट }

+0

यह इस प्रश्न के विषय से एक अलग मुद्दा है, जो फोरच लूप में वैश्विक पर्यावरण दुष्प्रभावों के बारे में है। साथ ही, आपका उदाहरण डूएसओओओ के साथ मेरे लिए काम करता है सिवाय इसके कि एक चेतावनी जारी की जाती है कि 'बाहरी_बोजेक्ट' पहले से ही निर्यात किया गया था, यह दर्शाता है कि आपको 'निर्यात' का उपयोग करने की आवश्यकता नहीं है। मुझे यकीन नहीं है कि आपके DoSNOW उदाहरण में क्या गड़बड़ है, लेकिन doParallel अक्सर काम करता है जब लिनक्स और मैक ओएस एक्स पर ऐसा विफल रहता है क्योंकि doParallel क्लस्टर ऐप्लीएलबी के बजाय mclapply के उपयोग के कारण। –

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