2010-03-05 2 views
8

के लिए कार्यान्वयन के लिए अनुशंसित कम मेमोरी हैशप मैं वर्तमान में प्रोग्रामिंग से संबंधित समस्या पर काम कर रहा हूं जहां मुझे डेटा का भारी हैशप बनाने का प्रयास किया गया है। डेटा के लिए कुंजी एक CharSequence का कस्टम कम-स्मृति कार्यान्वयन है जो हैशकोड() और बराबर (...) लागू करता है और मान इंटीजर ऑब्जेक्ट है।जावा

इस हैशटेबल में लाखों प्रविष्टियां हो सकती हैं और मैं इंटीजर को उस डेटा में एक पॉइंटर होने के द्वारा स्मृति के लिए स्मृति उपयोग को कम करने में कामयाब रहा हूं, लेकिन समस्या यह है कि कुंजी हो सकती है बाइट्स (औसत 25 बाइट्स पर) और हैश मैप के डिफ़ॉल्ट कार्यान्वयन में कुंजी को स्मृति में रखने की आवश्यकता है।

मुझे एक हैशैप की आवश्यकता है जिसमें कम मेमोरी ओवरहेड हो और जो संभवतः डिस्क पर कुंजी को पृष्ठ पर रखे या वैकल्पिक रूप से चाबियों के एक धोखे का प्रतिनिधित्व कर सके। यदि चाबियां खुद ही धोती हैं तो मैं हैश टकराव के बारे में चिंतित हूं।

आदर्श रूप से, मैं प्रति 50 एमबी हेप स्पेस (कुंजी में 25 बाइट्स की एक बाइट सरणी और मूल्य भाग में इंटीजर ऑब्जेक्ट) में एक लाख प्रविष्टियों को स्टोर करने में सक्षम होना चाहता हूं।

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

धन्यवाद,

क्रिस

+0

स्थान और समय अक्सर व्यापार संबंधों में होते हैं। नोड जोड़ने, खोजने, हटाने के लिए आपका प्रदर्शन/स्केलेबिलिटी आवश्यकता क्या है? यदि आप बस कम स्मृति चाहते हैं तो आप एक सरणी का उपयोग कर सकते हैं। –

+1

इस तरह की आवाज़ें आप चाहते हैं कि स्मृति डेटाबेस में है? –

उत्तर

3

आप जावा के हैश मानचित्र का उपयोग कर सकते हैं और एक फ़ाइलके क्लास लिख सकते हैं जो एक RandomAccessFile, ऑफ़सेट और लंबाई लेता है, निर्माण में हैश का प्रीकंप्यूट करता है और जो तुलना के लिए फ़ाइल से डेटा को पढ़कर तुलनात्मक रूप से लागू करता है।

एक साधारण एमआरयू कैश के संयोजन के साथ, आप एक ही हैशप का उपयोग करके स्मृति में कुछ चाबियाँ रख सकते हैं जो कि एक ही कुंजी पर कुंजी है, लेकिन जो एक कस्टम तुलनित्र का उपयोग करता है जो केवल ऑफसेट और लंबाई मानों की तुलना करता है (फाइल नहीं डेटा)।

2

कैसे बर्कले DB Java Edition के बारे में? इसकी StoredMap क्लास जो दिख रही है उसे दिखती है।

1

मुझे लगता है कि डिफ़ॉल्ट HashSet जाने का कोई बुरा तरीका नहीं है - कुंजी-मूल्य जोड़ी स्वयं बनाएं (इसलिए आपको उन्हें किसी अतिरिक्त ऑब्जेक्ट में लपेटना नहीं है)। यह उस तरह की स्मृति-कुशल है; यह वास्तव में मूल्य के लिए आपके मुख्य ऑब्जेक्ट + 4 बाइट्स के शीर्ष पर केवल (1/loadFactor)^(3/2) * 4 बाइट्स अधिक मेमोरी की आवश्यकता है। प्रैक्टिस में, इसे प्रति प्रविष्टि के 8 बाइट ओवरहेड की तरह कुछ जोड़ना चाहिए। (यदि आप पहले से जानते हैं कि आप कितनी कुंजी स्टोर करने जा रहे हैं, तो आप इसे और कम कर सकते हैं।)