2013-02-04 17 views
13

मैं multicore पैकेज (उबंटू पर) से mclapply के साथ काम कर रहा हूं, और मैं एक ऐसा फ़ंक्शन लिख रहा हूं जिसके लिए mclapply(x, f) के परिणाम क्रम में लौटाए गए हैं (यानी f(x[1]), f(x[2]), ...., f(x[n]))।क्या मैक्लेप्ली ने अपने परिणामों को क्रम में वापस करने की गारंटी दी है?

# multicore doesn't work on Windows 

require(multicore) 
unlist(mclapply(
    1:10, 
    function(x){ 
     Sys.sleep(sample(1:5, size = 1)) 
     identity(x)}, mc.cores = 2)) 

[1] 1 2 3 4 5 6 7 8 9 10 

ऊपर कोड के अर्थ में किया lapply के रूप में एक ही क्रम में है कि mclapply परिणाम प्रदान करती है लगता है।

हालांकि, अगर यह धारणा गलत है तो मुझे अपने कोड को दोबारा सुधारने में काफी समय व्यतीत करना होगा, इसलिए मैं इस पैकेज/समांतर कंप्यूटिंग से परिचित किसी से आश्वासन प्राप्त करने की उम्मीद कर रहा हूं कि यह धारणा सही है।

क्या यह मानना ​​सुरक्षित है कि mclapply वैकल्पिक तर्कों के बावजूद हमेशा इसके परिणाम लौटाता है?

+1

डॉक्स का संकेत नहीं है कि परिणाम तले में आ सकता है, और यह स्पष्ट है कि यह एक समानांतर है 'lapply' का संस्करण, जो इनपुट के रूप में आदेश दिया गया सूची देता है। आप अनुक्रमिक और समांतर मोड में अपने कोड का एक भाग चला सकते हैं और देख सकते हैं कि यह आपके विशेष मामले के लिए है या नहीं। मैं अनुमान लगाता हूं कि यह करता है। –

उत्तर

15

संक्षिप्त उत्तर: यह परिणाम सही क्रम में वापस कर देता है।

लेकिन निश्चित रूप से, आप अपने आप को कोड पढ़ना चाहिए (mclapply एक अनुसंधान कार्य है ...)

collect के लिए आदमी पृष्ठ कुछ और संकेत देता है: expr कम उपयोग करता है:

नोट -लेवल मल्टीकोर फ़ंक्शन जैसे कि SendMaster एक एकल नौकरी कई बार परिणाम दे सकता है और यह उपयोगकर्ता की जिम्मेदारी सही ढंग से व्याख्या करने की ज़िम्मेदारी है।

हालांकि, अगर आप निम्न स्तर के साथ गड़बड़ नहीं है,

रिटर्न किसी भी परिणाम है कि एक सूची में उपलब्ध हैं इकट्ठा। परिणाम निर्दिष्ट नौकरियों के समान क्रम होंगे। यदि कई नौकरियां हैं और नौकरी का नाम है तो इसका परिणाम परिणाम देने के लिए उपयोग किया जाएगा, अन्यथा इसकी प्रक्रिया आईडी का उपयोग किया जाएगा।

(मेरा जोर)

mclapply के लिए अब

। स्रोत कोड की पैदावार से अधिक एक त्वरित ग्लांस:

  • अगर !mc.preschedule और कोई अधिक नौकरियों की तुलना में कोर (length (X) <= cores) parallel और collect इस्तेमाल किया जाता है, ऊपर देखें।
  • यदि mc.preschedule या कोर की तुलना में अधिक नौकरियां, mclapply स्वयं ही आदेश का ख्याल रखता है - कोड देखें।

    > unlist (mclapply(1:10, function(x){ 
        Sys.sleep(sample(1:5, size = 1)); 
        cat (x, " ");  
        identity(x)}, 
        mc.cores = 2, mc.preschedule = FALSE)) 
    1 2 4 3 6 5 7 8 9 10 [1] 1 2 3 4 5 6 7 8 9 10 
    > unlist (mclapply(1:10, function(x){ 
        Sys.sleep(sample(1:5, size = 1)); 
        cat (x, " ");  
        identity(x)}, 
        mc.cores = 2, mc.preschedule = TRUE)) 
    1 3 2 5 4 6 7 8 10 9 [1] 1 2 3 4 5 6 7 8 9 10 
    

    चलता कौन सा है कि परिणाम बच्चे जॉब (अधिक संक्षेप द्वारा भिन्न क्रम में लौटा दिया जाता है:

हालांकि, यहां अपने प्रयोग का एक संशोधित संस्करण है बच्चे नौकरियों थोड़ा के बारे में अलग में समाप्त करने के लिए कर रहे हैं आदेश), लेकिन परिणाम मूल क्रम में इकट्ठा किया गया है।

(कंसोल पर काम करता है, लेकिन RStudio में नहीं - cat रों वहां प्रदर्शित नहीं)

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