2012-11-12 13 views
5

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

जब मैं मूल रूबी प्रोग्राम चलाता हूं, तो क्या यह एक प्रोसेसर का उपयोग करता है? यदि मैंने विशेष रूप से प्रोसेसर को कार्यों को असाइन नहीं किया है, तो रूबी मेरे प्रोग्राम को नहीं पढ़ेगी और जितनी जल्दी संभव हो सके प्रोग्राम को पूरा करने के लिए प्रत्येक प्रोसेसर को जादुई रूप से लोड करेगा? मैं नहीं मान रहा हूं ...

मैं रूबी को तेज़ करने पर थोड़ा सा पढ़ रहा हूं, और एक और थ्रेड में पढ़ा है कि रुबी सच मल्टीथ्रेडिंग का समर्थन नहीं करती है (हालांकि यह कहा जाता है कि जेआरबीई करता है)। लेकिन, अगर मैं अपने कार्यक्रम को दो हिस्सों में "तोड़ना" चाहता था जिसे अलग-अलग उदाहरणों में चलाया जा सकता है और इन्हें पैरारल में चलाया जा सकता है ... क्या ये दो भाग स्वचालित रूप से दो अलग प्रोसेसर पर चलेंगे? अगर मेरे पास चार प्रोसेसर थे और चार गोले खोल दिए और कार्यक्रम के चार अलग-अलग हिस्सों (1/4) भाग गए - क्या यह समय 1/4 में पूरा होगा?

अद्यतन

टिप्पणियों को पढ़ने के बाद मैं JRuby एक शॉट देने का फैसला किया। ऐप को पोर्ट करना मुश्किल नहीं था। मैंने अभी तक "आड़ू" का उपयोग नहीं किया है, लेकिन बस इसे JRuby में चलाकर, ऐप 1/4 समय में चलता है !!! पागल। मैंने उस बदलाव की अपेक्षा नहीं की थी। देने के लिए जा रहे हैं। अब एक शॉट करें और देखें कि इससे चीजों में सुधार कैसे होता है। अभी भी उस बढ़ावा पर विश्वास नहीं कर सकते हैं।

अद्यतन # 2

बस आड़ू को आज़माएं। उस समय से 15% अधिक शेविंग समाप्त हो गया। तो JRuby पर स्विचिंग और पीच का उपयोग निश्चित रूप से इसके लायक था।

सभी को धन्यवाद!

+0

स्रोत कोड को देखे बिना हम अनुमान लगा रहे हैं कि आपके आवेदन को तेज़ करने के लिए क्या किया जा सकता है। हालांकि, अगर आप कुछ चीजें कठिन/धीमी तरीके से कर रहे हैं, तो इसे थोड़ा सा गति देना संभव हो सकता है। –

उत्तर

4

जेआरबीई और peach मणि का उपयोग करें, और यह आसान नहीं हो सकता है। बस .each को .peach और वॉयला के साथ प्रतिस्थापित करें, आप समानांतर में निष्पादित कर रहे हैं। और यह नियंत्रित करने के लिए अतिरिक्त विकल्प हैं कि वास्तव में कितने धागे पैदा हुए हैं, आदि। मैंने इसका उपयोग किया है और यह बहुत अच्छा काम करता है।

आप करीब n बार speedup मिल जहां n उपलब्ध सीपीयू/कोर की संख्या है। मुझे लगता है कि थ्रेड की इष्टतम संख्या CPUs/कोर की संख्या से थोड़ा अधिक है।

0

थ्रेडिंग आमतौर पर रूबी के कमजोर बिंदुओं में से एक माना जाता है, लेकिन यह उस रूबी के कार्यान्वयन पर निर्भर करता है जिस पर आप उपयोग करते हैं।

विभिन्न थ्रेडिंग मॉडल पर वास्तव में एक अच्छा लेखन "Does ruby have real multithreading?" है।

मेरे अनुभव से और जो लोग मैंने इस सामान के बारे में बेहतर जानते हैं, उससे मुझे लगता है कि ऐसा लगता है कि यदि आप रुबी कार्यान्वयन का चयन करने जा रहे हैं, तो जेआरबीई जाने का रास्ता है। हालांकि, यदि आप रूबी सीख रहे हैं तो आप एक और भाषा चुनना चाहेंगे जैसे कि एरलांग, या शायद क्लोजर, जो कि आप लोकप्रिय विकल्प हैं यदि आप JVM का उपयोग करना चाहते हैं।

0

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

सबसे अच्छे मामले में यह 1/एन समय में चलाएगा, लेकिन इस तरह की चीज ठीक से ठीक हो सकती है क्योंकि सिस्टम के कुछ हिस्सों, स्मृति की तरह, प्रक्रियाओं और बीच के बीच विवाद के बीच साझा करने की आवश्यकता है प्रक्रियाएं चीजों को रैखिक रूप से स्केल नहीं कर सकती हैं। यदि विभाजन करना आसान है तो मैं इसे आज़मा दूंगा। आप एक ही प्रोग्राम को दो बार चलाने का प्रयास कर सकते हैं और देख सकते हैं कि इसे चलाने में कितना समय लगता है, यदि इसे चलाने के लिए उतना ही समय लगता है, क्योंकि यह दो सेट करने के लिए होता है, तो आप बस सेट कर सकते हैं, बस अपना डेटा विभाजित करें और इसके लिए जाएं यह।

जरुबी और कुछ धागे की कोशिश करने से शायद मदद मिलेगी, लेकिन इससे जटिलता की उचित मात्रा बढ़ जाती है। (यह थ्रेडिंग के बारे में जानने के लिए शायद एक अच्छा बहाना होगा।)

2

दूसरों की तरह रूबी के एमआरआई कार्यान्वयन (सबसे अधिक लोग उपयोग करने वाले) मूल धागे का समर्थन नहीं करते हैं। इसलिए आप एमआरआई कार्यान्वयन का उपयोग करके अधिक धागे लॉन्च करके सीपीयू कोर के बीच काम को विभाजित नहीं कर सकते हैं।

हालांकि यदि आपकी प्रक्रिया आईओ-बाध्य है (उदाहरण के लिए डिस्क या नेटवर्क गतिविधि द्वारा प्रतिबंधित), तो आप अभी भी कई एमआरआई-धागे से लाभ उठा सकते हैं।

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

लेकिन सभी खो नहीं गए हैं। एमआरआई (और अन्य सभी रूबी कार्यान्वयन) के साथ, आप अभी भी काम को विभाजित करने के लिए प्रक्रिया का उपयोग कर सकते हैं।

यह इस तरह के उदाहरण के लिए Process.fork उपयोग किया जा सकता:

Process.fork { 
    10.times { 
    # Do some work in process 1 
    sleep 1 
    puts "Hello 1" 
    } 
} 

Process.fork { 
    10.times { 
    # Do some work in process 2 
    sleep 1 
    puts "Hello 2" 
    } 
} 

# Wait for the child processes to finish 
Process.wait 

का उपयोग करना fork, सीपीयू कोर के बीच प्रसंस्करण बंट जाएगा, इसलिए यदि आप धागे बिना रह सकते हैं तो अलग प्रक्रियाओं एक तरह से यह करने के लिए कर रहे हैं।

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