का उपयोग करके समानांतर में संख्याओं की एक बड़ी सूची के योग की गणना कैसे कर सकता हूं। मैं यह समझने की कोशिश कर रहा हूं कि समानांतर में बड़े अनुक्रम में एक सरल ऑपरेशन को कुशलतापूर्वक लागू करने के लिए क्लोजर का उपयोग कैसे करें। मैं कुछ गति प्राप्त करने के लिए अपनी मशीन पर एकाधिक कोर का लाभ उठाने के लिए समांतर समाधान का उपयोग करने में सक्षम होना चाहता हूं।क्लोजर
मैं विभाजन के साथ संयोजन में pmap का उपयोग करने का प्रयास कर रहा हूं-सभी इनपुट seq में प्रत्येक आइटम के लिए भविष्य बनाने के ऊपरी हिस्से को कम करने के लिए। दुर्भाग्य से, विभाजन-सभी प्रत्येक विभाजन seq के पूर्ण मूल्यांकन को मजबूर करता है। यह मेरी मशीन पर OutOfMemoryError का कारण बनता है।
(defn sum [vs]
(reduce + vs))
(def workers
(+ 2 (.. Runtime getRuntime availableProcessors)))
(let
[n 80000000
vs (range n)]
(time (sum vs))
(time (sum (pmap sum (partition-all (long (/ n workers)) vs)))))
मैं बड़े इनपुट सेट में योग कैसे लागू कर सकता हूं, और धारावाहिक कार्यान्वयन के प्रदर्शन को हरा सकता हूं?
समाधान reducers पुस्तकालय ओर इशारा करते हुए के लिए @Arthur Ulfeldt को
धन्यवाद। Reducers का उपयोग कर समाधान यहाँ है। बहु-कोर मशीन पर चलते समय यह कोड अपेक्षित प्रदर्शन सुधार दिखाता है। (नोट: मैं बनाम बदल दिया है समय और अधिक सटीक हो बनाने के लिए एक समारोह होने के लिए)
(require '[clojure.core.reducers :as r])
(let
[n 80000000
vs #(range n)]
(time (reduce + (vs)))
(time (r/fold + (vs)))
मात्रा गलत तरीके से कर रहे हैं चारों ओर? '(विभाजन- सभी मजदूर बनाम)' '(/ एन श्रमिक) 'लंबाई' श्रमिकों के अनुक्रम 'बनाता है। क्या आप नहीं चाहते '(विभाजन-सभी (लंबे (/ एन श्रमिक) बनाम)'? –
@ ए। वेब, आपके सुधार के लिए धन्यवाद। मैं सवाल में संशोधन करूंगा। यह फिक्स समानांतर संस्करण को थोड़ा तेज़ बनाने में मदद करता है, लेकिन यह अभी भी धारावाहिक कार्यान्वयन को हरा नहीं सकता है, और यह अभी भी बहुत बड़े इनपुट पर स्मृति से बाहर चला जाता है। –