2009-03-12 11 views
5

मुझे एक आवश्यकता है कि एक मानचित्र 50 ~ 200 प्रविष्टियों के साथ बनाया जाएगा (यह और भी हो सकता है, चलिए इसे बहुत कम नहीं कहते हैं)। लेखन केवल एक बार किया जाता है और पढ़ना (Map.get ("keyName") का उपयोग करके) 20 से अधिक अनुरोध (यह एक वेबएप है) जा सकता है।जावा में लिखें-एक बार पढ़ें- कई मानचित्र?

मैं वर्तमान में हैशमैप के लिए जा रहा हूं (मुझे लगता है) मुझे सबसे इष्टतम प्रदर्शन देता है (नोट: प्रति अनुरोध कई पढ़ता है)। डेटा-स्ट्रक्चर लड़का नहीं है, क्या आप में से कोई भी नक्शा कार्यान्वयन का सुझाव दे सकता है जो मेरी आवश्यकता के लिए सबसे उपयुक्त है, java.lang। *, अपाचे कॉमन्स, आदि पैकेज से कहें?

वाईसी

उत्तर

7

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

और मैप को बदलने की कोशिश करने से पहले मैं देखता हूं कि क्यों, मुझे एक वेब पेज उत्पन्न करने के लिए 4000 लुकअप (20 प्रविष्टियों द्वारा 200 प्रविष्टियां) करने की ज़रूरत है।

लेकिन एक शर्त पर मुझे लगता है कि उन 4000 लुकअप करने का समय प्रक्रिया के अन्य हिस्सों की तुलना में नगण्य हो जाएगा।

+0

तर्क यह हो सकता है कि यह किसी प्रकार का ऑनलाइन एक्सेल चीज़माजिगर है और इसके पीछे बुरा विरासत कोड है। हैश मैप बेहद तेज है हालांकि (ConcurrentHashMap भी तेज़ है!) और यदि नक्शा प्रति अनुरोध 4000 बार कहा जाता है, तो जेआईटी इसे फ्लाई पर पूरी तरह से फिर से भर देगा। – Esko

+0

@Esko ConcurrentHashMap तेज है? यह हैश मैप के सभी कुंजी-मूल्य बनाम हैश + इंडेक्स के माध्यम से चलने के लिए इटरेटर का उपयोग करता है। yc – yclian

2

तो राईट के सभी से किया जाता है से पहले के किसी भी पढ़ता है तो आप Collectons.unmodifiableMap विधि का उपयोग कर सकते हैं।

अगर ऐसी बात है तो क्या आप चाहते हैं बहुत कठिन नहीं है ऐसा करने के लिए कोड लिखने नहीं है (बंद भटक पद उस में बुनियादी कोड है ... लगता है)

हम्म ... सिर्फ यह सुनिश्चित करने के लिए कि सवाल यह है कि मैं क्या सोच रहा हूं ... क्या केवल महत्वपूर्ण हिस्सा ही महत्वपूर्ण हिस्सा है या डेटा को सबसे महत्वपूर्ण भाग तक पहुंचने का प्रयास कर रहा है?

संपादित करें: एक प्रोफाइलर साथ, देखने के लिए (टिप्पणी के आधार पर)

आप की जाँच की है, तो कोड धीमी है? यदि नहीं तो आपको इसके बारे में चिंता नहीं करनी चाहिए।

+0

उत्तर के लिए धन्यवाद। उत्तरार्द्ध (एकाधिक पढ़ने) अधिक महत्वपूर्ण है। कारण मैंने केवल पढ़ने के बारे में बताया, क्योंकि मैं सोच रहा था कि इस वजह से हैशिंग/इंडेक्सिंग किसी भी तरह से सुधार हो सकती है। yc – yclian

+0

अनमोडिफायबल मानचित्र अंतर्निहित मानचित्र के आस-पास एक रैपर है; यह प्रतिनिधिमंडल के इस अतिरिक्त स्तर को जोड़ने के लिए वास्तव में प्रदर्शन को नुकसान पहुंचाएगा। – erickson

+0

हां, इसलिए मेरा प्रश्न केवल पढ़ने के लिए और अधिक महत्वपूर्ण था और फिर पूछ रहा था कि कोड प्रोफाइल किया गया था और धीमा होने के लिए जाना जाता है :-) – TofuBeer

1

यदि यह वास्तव में एक बाधा थी तो मैं टकराव से बचने के लिए मानचित्र का आकार बदलना चाहता हूं।

0

यदि आप शुरुआत में सख्ती से लिखते हैं, पाठकों के शुरू होने से पहले, तो सिंक्रनाइज़ेशन और थ्रेड में साझा करना समस्या नहीं है ... हैश मैप आपका मित्र है। जब आप इसके बारे में निश्चित नहीं हैं: ConcurrentHashMap।

दोनों कार्यान्वयन जेडीके का हिस्सा हैं।

0

कई साल पहले (एक स्कूल प्रोजेक्ट के रूप में), मैंने सी में एक बार लिखा था-एक बार पढ़ने-कई मैपिंग (और अन्य संग्रह) जो एक मौजूदा संग्रह लेते थे, और फिर एक और अधिक स्मृति बनाकर "इसे सील कर दिया" कैश-कुशल प्रतिनिधित्व (उदाहरण के लिए, एक ग्राफ को अनुकूलित सरणी के रूप में संग्रहीत किया गया था)। हमने अद्भुत प्रदर्शन अंतर देखा।

चूंकि जावा इंटरफेस का समर्थन करता है, इस तरह कुछ लागू करना बहुत आसान हो सकता है (और वास्तव में प्रोत्साहित किया जाता है) लेकिन मैं आउट ऑफ़ द बॉक्स कार्यान्वयन से परिचित नहीं हूं।

1

यदि यह वास्तव में परेशानी के लायक है, तो आप perfect hashing आज़मा सकते हैं। हालांकि, मैं किसी भी जावा कार्यान्वयन से परिचित नहीं हूं।

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