2012-03-21 17 views
6

नमस्ते मैं MC पैकेज के साथ plyr लाइब्रेरी में ddply का उपयोग करने की कोशिश कर रहा हूं। ऐसा लगता है कि गणना को तेज नहीं किया जा रहा है। यह कोड मैं चलाता हूं:प्लीयर के साथ मल्टीकोर, एमसी

require(doMC) 
registerDoMC(4) 
getDoParWorkers() 
##> 4 
test <- data.frame(x=1:10000, y=rep(c(1:20), 500)) 
system.time(ddply(test, "y", mean)) 
    # user system elapsed 
    # 0.015 0.000 0.015 
system.time(ddply(test, "y", mean, .parallel=TRUE)) 
    # user system elapsed 
    # 223.062 2.825 1.093 

कोई विचार?

+3

आपके द्वारा किए जा रहे वास्तविक गणनाओं के आधार पर, 'data.table' पैकेज वास्तव में उन्हें वास्तव में गति दे सकता है। अपने सभी गुणों के लिए, 'प्लीयर' पैकेज में 'विभाजन-लागू-गठबंधन' कार्यान्वयन वास्तव में काफी धीमा है, जबकि 'data.table' सबसे पहले और सबसे तेज़ गति के लिए डिज़ाइन किया गया है। (यदि आप चिंतित हैं, तो बहुत से शुरुआती बिंदु प्राप्त करने के लिए '[r] [data.table] plyr' जैसे कुछ के लिए SO खोजें।) –

+0

धन्यवाद जोश, मैं एक नज़र डालेगा। – Alex

उत्तर

10

mean फ़ंक्शन स्प्लिट सेक्शन को प्रत्येक कोर में वितरित करने और परिणामों को पुनर्प्राप्त करने के लिए आवश्यक संचार लागत के सापेक्ष बहुत तेज़ी से संचालित होता है।

यह एक आम "समस्या" है जो वितरित कंप्यूटिंग के साथ चलती है। वे उम्मीद करते हैं कि यह सब कुछ तेजी से चलने के लिए क्योंकि वे भूल जाते हैं कि लागत (नोड्स के बीच संचार) के साथ-साथ लाभ (एकाधिक कोर का उपयोग करके) हैं।

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

+0

यह सिर्फ एक उदाहरण है। मेरे पास वास्तविक डेटा फ्रेम 2000 समूहों के साथ 4 मिलियन पंक्तियां है। समांतर के साथ कोड और बिना किसी रिटर्न के। – Alex

+1

@Alex: यदि आपका डेटा.फ्रेम बड़ा है, तो आपके फ़ंक्शन को अधिक जटिल रूप से गहन होना आवश्यक है क्योंकि 'ddply' में बिताए गए अधिकांश समय को विभाजन और लागू करने के लिए, विभाजन को लागू नहीं किया जा रहा है। –

+0

मैं देखता हूं .. तो जो भाग इसे वितरित करता है वह फ़ंक्शन का वास्तविक अनुप्रयोग है .. यह विभाजन अभी भी 1 कोर पर करता है? – Alex

1

यहोशू के उत्तर में निरंतरता, यदि आप इस ऑपरेशन को तेज करना चाहते हैं तो एक फिक्स है। यह नक्शा-कम विचारधारा से प्रेरित है और मैंने कुछ समय पहले नमूना डेटासेट पर पीओसी किया था।

मैंने बर्फबारी पुस्तकालय का उपयोग किया- मुझे विश्वास है कि आप डीएमसी के साथ भी काम कर सकते हैं।

# On my phone, please pardon typos/bugs 

test <- data.frame(x=1:1000000, y=rep(c(1:20), 500)) 

testList = list() 
testList[[1]] <- test[c(1:250000),] 
testList[[2]] <- test[c(250001:500000),] 
testList[[3]] <- test[c(500001:750000),] 
testList[[4]] <- test[c(750001:1000000),] 

# Write a function for the above - Need to find optimum number of splits 

sfInit(parallel = TRUE, cpus=4) 
sfCluster(plyr) 
meanList = sfClusterSpplyLB(testList, function(x) ddply(test, "y", mean)) 

sfStop() 

aggregate(meanList, by=list(y), FUN=mean) 

यह पराक्रम यदि आपको मदद की, यह देखते हुए कि अब हम एक वितरित फैशन में विभाजित गठबंधन नियमित कर रहे हैं। यह उन तरीकों से काम करता है जब विभाजन का आकार समान होता है, यह रकम, न्यूनतम/अधिकतम, गिनती आदि के लिए काम करता है ठीक है लेकिन कुछ ऐसे ऑपरेशन हैं जिनका हम इसका उपयोग नहीं कर सकते हैं।

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

  • कोई संबंधित समस्या नहीं^_^