2012-10-12 16 views
5

The easiest way to convert a Java Collection to a Scala equivalent is using JavaConversions, since Scala 2.8. से स्कैला समांतर संग्रह कैसे बनाएं। ये अंतर्निहित जावा संग्रह के लिए रिटर्न रैपर को रोकता है।जावा संग्रह

स्कैला 2.9 समांतर संग्रह प्रस्तुत किया गया, जहां संग्रह पर संचालन समानांतर में निष्पादित किया जा सकता है और परिणाम बाद में एकत्र किया जा सकता है। यह आसानी से लागू किया गया है, एक समानांतर एक में एक मौजूदा संग्रह परिवर्तित करने के रूप में सरल है:

myCollection.par 

लेकिन वहाँ JavaConversions का उपयोग कर जावा संग्रह से परिवर्तित संग्रह पर 'बराबर' का उपयोग कर के साथ एक समस्या है। Parallel Collection Conversions में वर्णित है, स्वाभाविक अनुक्रमिक संग्रह एक नया समानांतर संग्रह में सभी मान का मूल्यांकन करने और उन्हें नए समानांतर संग्रह में शामिल करके 'मजबूर' कर रहे हैं:

ऐसी सूची, कतारों या नदियों के रूप में

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

यह मूल कारण है जब मूल जावा संग्रह का आलसी मूल्यांकन किया जाना है। उदाहरण के लिए, यदि केवल जावा इटेबल लौटाया जाता है, बाद में स्कैला इटेरेबल में परिवर्तित किया जाता है, तो इस बात की कोई गारंटी नहीं है कि इटेबल की सामग्री को उत्सुकता से एक्सेस किया जाना है या नहीं। तो प्रत्येक तत्व का मूल्यांकन करने की लागत को बनाए रखने के बिना जावा संग्रह से समानांतर संग्रह कैसे बनाया जाना चाहिए? यह लागत है कि मैं समानांतर में निष्पादित करने के लिए समांतर संग्रह का उपयोग करके बचने की कोशिश कर रहा हूं और आशा करता हूं कि प्रस्तावित पहले एन परिणाम 'ले लें'।

Parallel Collection Conversions के अनुसार संग्रह प्रकारों की एक श्रृंखला है जो स्थिर समय की लागत होती है, लेकिन यह गारंटी प्राप्त करने का एक तरीका प्रतीत नहीं होता है कि इन प्रकारों को JavaConversions (जैसे 'सेट' बनाया जा सकता है, लेकिन क्या यह 'हैशसेट' है?)।

+1

ध्यान दें कि JavaConversions के बजाए JavaConverters का उपयोग करना बेहतर होगा, इसके साथ ही आप .asScala.toList.par जैसे कुछ करने में सक्षम होंगे। –

उत्तर

4

सबसे पहले, जावा संग्रह से JavaConversion एस के माध्यम से प्राप्त हर संग्रह एक डिफ़ॉल्ट-समानांतर स्केल संग्रह नहीं है - इसका मतलब है कि इसे हमेशा इसके समानांतर संग्रह कार्यान्वयन में पुनर्मूल्यांकन किया जाएगा। इसका कारण यह है कि समांतर निष्पादन कम से कम Splitters की अवधारणाओं पर निर्भर करता है - इसे छोटे सबसेट में विभाजित किया जाना चाहिए जिससे विभिन्न प्रोसेसर काम कर सकें।

मुझे नहीं पता कि आपका जावा संग्रह डेटा-संरचना के अर्थ में कैसा दिखता है, लेकिन यदि यह एक वृक्ष जैसी चीज है या जिसके नीचे तत्वों का मूल्यांकन किया जाता है, तो संभावना है कि आप Splitter को आसानी से कार्यान्वित कर सकते हैं।

यदि आप उत्सुकता से force एक आलसी संग्रह नहीं चाहते हैं जो जावा संग्रह API लागू करता है, तो आपका एकमात्र विकल्प implement a new type of a parallel collection उस विशेष आलसी जावा संग्रह के लिए है। इस नए कार्यान्वयन में आपको इटरेटर को विभाजित करने के साधन प्रदान करना होगा (यानी, Splitter)।

एक बार जब आप इस नए समांतर संग्रह को कार्यान्वित करते हैं जो जानता है कि आपके डेटा-स्ट्रक्चर को कैसे विभाजित किया जाए, तो आपको अपने विशिष्ट जावा संग्रह के लिए एक कस्टम स्कैला रैपर बनाना चाहिए (इस बिंदु पर यह अतिरिक्त बॉयलरप्लेट का थोड़ा सा हिस्सा है, देखें कि यह कैसे किया जाता है JavaConversions में) और अपने विशिष्ट समानांतर संग्रह को वापस करने के लिए अपने par को ओवरराइड करें।

आप इसे सामान्य रूप से अनुक्रमित अनुक्रमों के लिए भी करने में सक्षम हो सकते हैं। यह देखते हुए कि अपने जावा संग्रह एक दृश्य (एक List जावा में,) एक विशेष रूप से कुशल get विधि के साथ है, तो आप एक इटरेटर कि 0 से size - 1 के लिए प्रारंभिक सीमा के भीतर get कॉल के रूप में Splitter को लागू कर सकता है, और इस सीमा subdividing द्वारा विभाजित है।

यदि आप करते हैं, तो मानक पुस्तकालय में पैच हमेशा स्वागत करते हैं।

1

समांतर को यादृच्छिक पहुंच और java.lang.Iterable की आवश्यकता नहीं है। यह एक मौलिक विसंगति है कि रूपांतरणों की कोई भी संख्या आपको आराम से नहीं लाएगी।

गैर-प्रोग्रामिंग समानता का उपयोग करने के लिए, आप सिंगापुर से इंग्लैंड में एक व्यक्ति और ऑस्ट्रेलिया से दूसरे सिंगापुर में एक ही समय भेजकर ऑस्ट्रेलिया से इंग्लैंड नहीं प्राप्त कर सकते हैं।

या प्रोग्रामिंग में यदि आप डेटा की लाइव स्ट्रीम संसाधित कर रहे हैं तो आप समय से डेटा को प्रोसेस करके उसी समय डेटा प्रोसेस करके समानांतर नहीं कर सकते हैं, जो डेटा को पांच मिनट पहले विलंबता के बिना डेटा प्रोसेस करके समानांतर नहीं कर सकता है।

आपको कुछ ऐसी चीज की आवश्यकता होगी जो कम से कम कुछ यादृच्छिक पहुंच प्रदान करे, जैसे Ivable के बजाय java.util.List.listIterator (Int)।

+0

मुझे लगता है कि मैंने प्रत्येक तत्व को अगले तत्व को पुनर्प्राप्त करने के लिए माना है (यानी Iterable.iterator()। अगला()) थ्रेड के अंदर चलाया गया था। –

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