2012-01-03 12 views
5

एक नकल परियोजना यूलर समस्याओं में असामान्य नहीं पैटर्न के लिए कुछ बराबर हो रहा है:एक स्केला ParStream

Stream.from(1).map(f).takeWhile((_>0)).foldLeft(0L)(_+_) 

जहां च कुछ महंगा करने के लिए गणना समारोह जो किसी अज्ञात बिंदु तक सकारात्मक मूल्यों रिटर्न है, और इसके बाद शून्य लौटाता है।

मुझे समांतर चीजों की तरह लगता है, खासकर जब स्कैला के समांतर संग्रह और .par इसे इतना आसान बनाते हैं। लेकिन एक ParStream के अभाव में, सबसे अच्छा मैं के साथ आ गया है:

val BATCH=1024 
Stream.from(1,BATCH).flatMap(
    i=>(i until i+BATCH).par.map(f) 
).takeWhile((_>0)).foldLeft(0L)(_+_) 

जो बहुत ही सुंदर प्रतीत होता है नहीं और BATCH मूल्य के चुनाव के प्रति संवेदनशील है (लेकिन पर x4 गति सुधार उपज कर सकते हैं मेरे क्वाड कोर)।

एक ही परिणाम प्राप्त करने के क्लीनर तरीकों के लिए कोई सुझाव?

+1

आपके द्वारा दिए गए उदाहरण समकक्ष नहीं हैं: उदाहरण के लिए 'वैल एफ = 15 - (_: Int) 'और' BATCH = 10' पहले 105 देता है और दूसरा 95 –

+0

@ लुइगी: यही कारण है कि मैंने इसे योग्यता दी "सकारात्मक मूल्यों को वापस देता है ... और इसके बाद शून्य लौटाता है"। उदाहरण के साथ यह def f (x) = 0 अधिकतम (15-x) के साथ काम करता है। – timday

उत्तर

5

ठीक है, आप उसे कुछ अतिरिक्त Stream from 1 grouped BATCH map (_.par) की तरह कुछ के साथ सुरुचिपूर्ण कर सकते हैं, हालांकि मैं नहीं बल्कि इस मामले में Iterator का उपयोग करेंगे - Stream की तुलना में बहुत हल्के वजन, और यह आरईपीएल की स्मृति को भरने नहीं होगा के रूप में मैं के साथ प्रयोग यह।

+0

धन्यवाद; मैंने समूहबद्ध विधि को पहले भी नहीं देखा था! – timday

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