2013-11-20 4 views
14

क्या स्कैला मानक भाषा के हिस्से के रूप में समानांतर मानचित्र संचालन निष्पादित करने का एक तरीका प्रदान करता है?समांतर नक्शा संचालन?

उदाहरण के लिए, दिए गए:

scala> val a = List((1,2), (3,4), (3,6)) 
a: List[(Int, Int)] = List((1,2), (3,4), (3,6)) 

मैं कर सकते हैं:

scala> a.map(tup => tup._1 + tup._2) 
res0: List[Int] = List(3, 7, 9) 

हालांकि, मेरी जानकारी के अनुसार इस सूची पर प्रदान समारोह क्रमिक रूप से वस्तुओं नक्शे के लिए। क्या प्रत्येक तत्व पर एक अलग थ्रेड (या समतुल्य) में फ़ंक्शन लागू करने का एक अंतर्निहित तरीका है, और उसके परिणामस्वरूप परिणामस्वरूप सूची में एकत्र हुए?

+2

List' का प्रयोग न करें 'वितरित (' par') के संचालन के लिए। आपको 'इंडेक्सेडस्क' का उपयोग करना चाहिए। – senia

+0

@senia - क्या आप जल्द ही इस बारे में विस्तृत जानकारी दे सकते हैं कि सूची का उपयोग क्यों करना इस मामले में एक बुरा विचार है? मुझे परिणामस्वरूप सूची को किसी भी तरह से आदेश देने की आवश्यकता नहीं है। – csvan

+5

यह 'par' विधि' समानांतर संग्रह 'के तरीके के कारण है। 'वेक्टर' के लिए (डिफ़ॉल्ट 'इंडेक्स किए गए' कार्यान्वयन), 'रेंज' और 'ऐरे' यह हल्के रैपर के साथ प्रारंभिक संग्रह को लपेटता है। लेकिन 'सूची' के लिए इसे एक पूरी तरह से नया संग्रह बनाना चाहिए, इससे प्रदर्शन समस्या हो सकती है। देखें [समांतर संग्रह बनाना] (http://docs.scala-lang.org/overviews/parallel-collections/overview.html#creating_a_parallel_collection)। – senia

उत्तर

25

यदि आप par जोड़ते हैं तो आपको समानांतर संग्रह और संचालन समानांतर में संसाधित किया जाएगा। एक सामान्य संग्रह में वापस कनवर्ट करने के लिए toList पर कॉल करें।

तो अपने कोड लगेगा जैसे:

a.par.map(tup => tup._1 + tup._2).toList 

Also, check the documentation.

7

par कई धागे पर प्रसंस्करण के लिए आपकी सूची को विभाजित करता है। इसके बाद आप ParSeq के tasksupport सदस्य को modyfying द्वारा थ्रेडिंग कैसे किया जा सकता है, यह नियंत्रित कर सकते हैं।