2011-01-31 10 views
7

मुझे किसी सूची में बड़ी संख्या में तत्व (500k या तो) रखने की आवश्यकता है या एक सेट जो मुझे उच्च प्रदर्शन ट्रैवर्सल, जोड़ और हटाने की आवश्यकता है। यह एक बहुप्रचारित वातावरण में किया जाएगा और मुझे कोई परवाह नहीं है कि क्या मुझे ट्रैवर्सल शुरू होने के बाद किए गए अपडेट देखने को मिलते हैं (कमजोर रूप से सुसंगत), इस परिदृश्य के लिए जावा संग्रह क्या सही है?इस मामले में उपयोग करने के लिए सही जावा संग्रह क्या है?

+0

ट्रैवर्सल या हमेशा शुरुआत/अंत में होने के दौरान अतिरिक्त और निष्कासन होता है? क्या यह प्रत्येक ट्रैवर्सल के दौरान होता है? –

+0

@ माइकल बोर्गवर्ड, यह एक बहुत ही अच्छी टिप्पणी है – bestsss

+0

एक या कई धागे तत्वों को जोड़/निकाल सकते हैं जबकि अन्य धागे संग्रह पर जा रहे हैं। यही कारण है कि मुझे एक कमजोर संगत संग्रह की आवश्यकता है। –

उत्तर

-1

डुप्लिकेट आइटम की अनुमति है?

हाँ है, सेट का उपयोग नहीं किया जा सकता है। आप अन्यथा सॉर्टेडसेट का उपयोग कर सकते हैं।

+0

तत्वों को सॉर्ट करने से जोड़ने/हटाने पर नकारात्मक प्रभाव पड़ेगा। और यहां आदेश की आवश्यकता नहीं है। – Nicolas

1

यदि ट्रैवर्सल == पढ़ा गया है, और == अपडेट जोड़ें/निकालें, तो मैं कहूंगा कि अक्सर यह नहीं होता कि एक ही संग्रह दोनों परिचालनों के लिए अनुकूलित किया जाता है।

लेकिन आपकी सबसे अच्छी शर्त HashMap होने की संभावना है।

+0

हैश मैप ट्रैवर्सल – bestsss

+0

के लिए * खराब * जैसा मैंने कहा, कुछ भी इष्टतम नहीं है। – duffymo

+0

java.util.HashMap (इसे थ्रेड सुरक्षित नहीं है) ट्रैवर्सल के लिए बस खराब है, यह एक लिंक की गई सूची को पार करने से भी बदतर है, जिसमें बहुत खराब (सीपीयू) कैशिंग विशेषताएं हैं [आजकल बहुत सारे एल्गोरिदम प्रदर्शन कैश-मिस द्वारा नियंत्रित होते हैं प्रवण वे हैं]। LinkedHashMap उस संबंध में थोड़ा बेहतर है लेकिन थ्रेड असुरक्षित भी है। – bestsss

1

थ्रेड कोशिश कर सकते हैं - तो j.u.concurrent को देखो। शायद ConcurrentHashMap सेट के रूप में उपयोग किया जाता है - उदा। जोड़ने (x) के बजाय put (x, x) का उपयोग करें।

1

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

the Concurrent Collections पर एक नज़र डालने से मदद मिल सकती है।

लेकिन "ट्रैवर्सल" से आपका क्या मतलब है?

+0

हालांकि इसके सूचकांक द्वारा इस तरह के संग्रह तक पहुंचने से सावधान रहें। – Qwerky

+0

ट्रैवर्सल संग्रह के दौरान मेरी स्थिति में संग्रह के तत्वों (जैसे उदाहरण के लिए foreach loops में) पर जा रहा है, मैं संग्रह को संशोधित नहीं करता हूं। ArrayList काम नहीं करेगा क्योंकि एकाधिक धागे से एक्सेस होने पर उन्हें सिंक्रनाइज़ करने की आवश्यकता है। –

0

यदि आपको किसी सूची के मध्य में आइटम को जोड़ने या निकालने की आवश्यकता है, तो लिंक्डलिस्ट एक अच्छी पसंद है। बहु-क्रम वातावरण में इसका इस्तेमाल करने के लिए, तो आप इसे इस सिंक्रनाइज़ करने की आवश्यकता:

List l = Collections.synchronisedList(new LinkedList()); 
+0

जब तक आप पूरे ट्रैवर्स को सिंक्रनाइज़ नहीं करते हैं, तब तक आप इसे पार नहीं कर सकते हैं, जो प्रत्येक नोड पर 500k और लगभग गारंटीकृत कैश-मिस के लिए एक भयानक विचार है। – bestsss

3

मैं या किसी सूची में तत्वों (500k या तो) की एक बड़ी संख्या एक सेट मैं क्या करने की जरूरत धारण करने के लिए की जरूरत है उच्च प्रदर्शन ट्रैवर्सल, जोड़ और हटाने। ... यह एक बहु-क्रम पर्यावरण


ConcrrentSkipListMap में किया जाएगा - यह एक सूची नहीं है, लेकिन सूची अर्थ विज्ञान समवर्ती वातावरण में व्यावहारिक रूप से बेकार हैं। यह तत्व एक पेड़ एक जैसे संरचना में सॉर्ट और हैशिंग माध्यम से सुलभ नहीं होगा, तो आप कुछ प्राकृतिक आदेश (या तुलनित्र के माध्यम से बाहरी) की जरूरत है ताकि

आप केवल जोड़ने की जरूरत है/एक पंक्ति के सिरों पर हटाने - ConcurrentLinkedQueue

सिंक्रनाइज़ संग्रह बहु-थ्रेडेड वातावरण के लिए उपयुक्त नहीं हैं यदि आप यहां तक ​​कि मध्यम विवाद की अपेक्षा करते हैं।उन्हें पूरे ट्रैवर्स ऑपरेशन के दौरान भी पूर्ण लॉक होल्डिंग की आवश्यकता होती है। मैं या तो ConcurrentHashMap के खिलाफ सलाह देंगे।

अंत में: आप 64+ की तरह वास्तविक बहु सीपीयू के लिए जा रहे हैं और उच्च विवाद की उम्मीद है और प्राकृतिक आदेश कड़ी का अनुसरण नहीं करना चाहते हैं: डेटा के बड़े आकार के कारण, http://sourceforge.net/projects/high-scale-lib

+0

एक ConcurrentHashMap द्वारा समर्थित सेट के बारे में, इस स्थिति में ConcurrentHashMap के विरुद्ध क्यों। EX। Collections.newSetFromMap (नया ConcurrentHashMap <ऑब्जेक्ट, बूलियन>()); –

0

दूसरी ओर क्या डेटाबेस में डेटा स्टोर करना संभव है? और कैश के रूप में स्मृति संग्रह का उपयोग करें।

+0

क्या आप विस्तारित कर सकते हैं, मुझे समझ में नहीं आता कि यह मेरी समस्या को हल करता है। –

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