2010-09-30 14 views
7

मैं जावा में एक सतत हैश संरचना की तलाश में हूं, एक साधारण कुंजी-मूल्य स्टोर, जहां कुंजी एक अद्वितीय स्ट्रिंग है और मान एक int है। जब भी किसी मौजूदा कुंजी को स्टोर में जोड़ा जाता है तो प्रत्येक कुंजी का मूल्य बढ़ाना होता है।जावा: बड़ी लगातार हैश संरचना?

मुझे यह काफी बड़ा होना चाहिए - संभवतः 500 मीटर - 1 बीएन कुंजी। मैं टोक्यो-कैबिनेट http://fallabs.com/tokyocabinet/javadoc/ का मूल्यांकन कर रहा हूं लेकिन यह सुनिश्चित नहीं करता कि यह कितना अच्छा होगा - हैश बढ़ने के साथ सम्मिलित समय लंबे समय तक लग रहा है।

क्या उचित हो सकता है पर कोई विचार?

धन्यवाद

संपादित करें: आदेश डिस्क मैं कम करने के लिए/ओ मैं तो एक ही बार में लगातार हैश को अद्यतन करने के एक में स्मृति HashMap में डेटा कैशिंग जा करने के लिए जा रहा हूँ, जब कैश एक करने के लिए बढ़ता है निश्चित आकार

संपादित 2: दृढ़ता के कारणों में से एक यह है कि मेरे पास रैम, 4 जीबी सीमित है, इसलिए मैं स्मृति में एक बड़े स्ट्रक्चर फिट नहीं कर सकता।

+0

दिलचस्प सवाल। –

+0

आपके पास ऐसी समस्या है जो हार्डवेयर की आपकी पसंद से सीमित होगी। आपको अपने सॉफ़्टवेयर को इस सीमा के आसपास काम करने के लिए डिज़ाइन करना चाहिए, हालांकि आपको केवल 4 बाइट प्रति प्रविष्टि की अनुमति है, जिससे आप पीड़ित होंगे क्योंकि डिस्क प्रदर्शन मुख्य स्मृति की तुलना में 1000x धीमी हो सकती है। –

उत्तर

5

मैं बात करता हूं मेगामैप जो आप खोज रहे हैं: http://megamap.sourceforge.net/

MegaMap एक मानचित्र (या hashtable) है कि डेटा की एक असीम राशि जमा कर सकते हैं की एक जावा कार्यान्वयन, केवल डिस्क स्थान उपलब्ध की राशि के द्वारा ही सीमित है: यहाँ अपने मुखपृष्ठ से Megamap का एक संक्षिप्त विवरण है । मानचित्र में संग्रहीत ऑब्जेक्ट्स डिस्क पर बने रहे हैं। अच्छा प्रदर्शन इन-मेमोरी कैश द्वारा प्राप्त किया गया है। मेगामैप सभी व्यावहारिक कारणों के लिए, असीमित संग्रहण स्थान के साथ मानचित्र कार्यान्वयन के रूप में सोचा जा सकता है।

+0

दिलचस्प लग रहा है, मैं इसे देख लूंगा, धन्यवाद –

+0

सुझाव के लिए धन्यवाद फिर से - लेकिन अनियमित दिखता है - नहीं 2005 से अपडेट किया गया :( –

+0

मैं एहैचे या अन्य टेराकोटा पुस्तकालयों पर एक नज़र डालेगा, शायद उनमें से एक आपकी मदद कर सकता है। मेगामैप एहैच के शीर्ष पर विकसित किया गया था, इसलिए यह खोज के लिए एक अच्छी दिशा है। शायद यह भी कर सकता है आउट ऑफ़ द बॉक्स। – Skarab

2

डेटाबेस का उपयोग हैश नहीं है। डेटाबेस 500 एम पंक्तियों के लिए भी काफी बड़ा हो रहा है। आप प्रति सेकंड कितने अपडेट की उम्मीद कर रहे हैं?

+0

क्या कोई नोएसक्यूएल डीबी उचित होगा - उदाहरण के लिए मोंगो डीबी? ये अनिवार्य रूप से एक महत्वपूर्ण मूल्य स्टोर सही हैं? –

0

तो, अगर मैं सही ढंग से समझता हूं, तो Redis एक विकल्प हो सकता है। आप उस कुंजी से जुड़े मूल्य को लंबवत रूप से बढ़ाने के लिए आईएनसीआर [कुंजी] कमांड जारी कर सकते हैं। यदि कुंजी मौजूद नहीं है, तो यह शून्य पर सेट है और फिर बढ़ी है (जिसके परिणामस्वरूप एक)। docs के मुताबिक, आईएनसीआर एक सतत समय ऑपरेशन है। रेडिस के लिए गति एक प्राथमिक डिजाइन लक्ष्य है।

रेडिस स्वयं को फ़ाइल में रखने में सक्षम है, और आप पैरामीटर को नियंत्रित करने के तरीके को नियंत्रित कर सकते हैं।

+0

रेडिस की तरह लगता है कि पूरी तरह से स्मृति में फिट होना पड़ सकता है।नोट्स से "बहुत तेजी से होने के लिए, साथ ही साथ पूरे डेटासेट को स्मृति में लिया जाता है"। मैं 4 जीबी रैम तक सीमित हूं। –

+0

इसमें वर्चुअल मेमोरी क्षमताएं हैं, http://code.google.com/p/redis/wiki/VirtualMemoryUserGuide। इसे आपके JVM के समान होस्ट पर स्थानीय रूप से चलाने की ज़रूरत नहीं है। बेशक, यह इस बात पर निर्भर करता है कि आपके संगठन ने आपके उत्पादन माहौल में क्या स्थापित कर सकते हैं ... – romacafe

+0

ठीक है, यह चेतावनी है: "चेतावनी: क्योंकि चाबियाँ नहीं बदल सकती हैं, रेडिस नहीं यदि अकेले चाबियां सीमा से अधिक जगह का उपयोग कर रही हैं तो वीएम-मैक्स-मेमोरी सेटिंग का सम्मान करने में सक्षम हो। " मुझे लगता है कि आपके लिए रेडिस का नियम है, जब तक कि आपको इसे चलाने के लिए वास्तव में एक बड़ा बॉक्स नहीं मिलता है ... – romacafe

0

मुझे लगता है कि Memcached बैकएंड में उपयुक्त डेटाबेस के साथ आपके मामले के लिए अच्छा विकल्प है।

2

क्या आपने बर्कले बीडी जावा संस्करण की जांच की है? उनके पास Collections-compatible API है (StoredMap के लिए जावाडोक भी देखें)।

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