2012-04-07 9 views
11

मान लें कि मेरे पास कुछ हद तक बड़ी (कई लाख वस्तुएं, या तो) स्ट्रिंग की सूची है। क्या यह एक अच्छा विचार है कुछ इस तरह चलाएँ:क्या यह एक अच्छा विचार है ... 'par.map (`बड़ी सूचियों पर सीधे?

val updatedList = myList.par.map(someAction).toList 

या यह ...par.map( चल रहा है, इस तरह से पहले सूची समूह के लिए एक बेहतर विचार होगा:

val numberOfCores = Runtime.getRuntime.availableProcessors 
val updatedList = 
    myList.grouped(numberOfCores).toList.par.map(_.map(someAction)).toList.flatten 

अद्यतन: (grouped की तुलना यह देखते हुए कि someAction काफी महंगा है , toList, आदि)

उत्तर

14

सीधे par.map चलाएं, क्योंकि यह पहले से ही कोर की संख्या को ध्यान में रखता है। हालांकि, List न रखें, क्योंकि समानांतर संग्रह में पूर्ण प्रतिलिपि बनाने की आवश्यकता है। इसके बजाय, Vector का उपयोग करें।

8

सुझाए गए अनुसार, सूचियों और par का उपयोग करने से बचें, क्योंकि सूची को उस संग्रह में कॉपी करने की आवश्यकता होती है जिसे आसानी से समानांतर में पार किया जा सकता है। स्पष्टीकरण के लिए Parallel Collections Overview देखें।

section on concrete parallel collection classes में वर्णित है, एक ParVector एक ParArray से map ऑपरेशन के लिए कम कुशल हो सकता है, इसलिए यदि आप प्रदर्शन के बारे में वास्तव में चिंतित हैं, यह एक समानांतर सरणी का उपयोग करने बनाना उचित है।

लेकिन, यदि someAction काफी महंगा है, तो इसकी कम्प्यूटेशनल लागत toList और par में अनुक्रमिक बाधाओं को छिप जाएगी।

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