2011-09-27 23 views
5

जावा का उपयोग करना मैं एक ऐसा मानचित्र बनाना चाहता हूं जो बढ़ सकता है और बढ़ सकता है और संभावित रूप से उपलब्ध स्मृति के आकार से बड़ा हो सकता है। अब स्पष्ट रूप से मानक POJO हैश मैप का उपयोग करके हम स्मृति से बाहर निकलने जा रहे हैं और JVM क्रैश हो जाएगा। तो मैं एक मानचित्र के साथ सोच रहा था कि अगर यह कम चलने वाली स्मृति के बारे में जागरूक हो जाता है, तो यह डिस्क पर वर्तमान सामग्री लिख सकता है।जावा में एक बहुत, बहुत बड़ा नक्शा बनाना

क्या किसी ने इस तरह कुछ भी लागू किया है या वहां मौजूद किसी भी मौजूदा समाधान के बारे में पता है?

जो मैं करने की कोशिश कर रहा हूं वह एक समय में एक बहुत बड़ी ASCII फ़ाइल (50 जीबी कहें) एक पंक्ति पढ़ा जाता है। प्रत्येक पंक्ति में एक कुंजी और एक मूल्य होता है। कुंजी को फाइल में डुप्लिकेट किया जा सकता है। मैं फिर प्रत्येक पंक्ति को मानचित्र में संग्रहीत करूंगा, जो मूल्यों की सूची के लिए कुंजी है। यह नक्शा वह वस्तु है जो सिर्फ बढ़ेगा और बढ़ेगा।

किसी भी सलाह की सराहना की।

फिल

अद्यतन:

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

+3

क्या एचएसक्यूएल जैसे इन-मेमोरी डेटाबेस का उपयोग करना आसान नहीं होगा? – mcfinnigan

+0

आप किस कुंजी/मूल्य प्रकार का मानचित्रण कर रहे हैं? –

+0

मैं डेटाबेस दृष्टिकोण पर उत्सुक नहीं हूं। यह बहुत भारी वजन है। – Phil

उत्तर

12

मुझे लगता है कि आप एक डेटाबेस की तलाश में हैं।

+0

:) ठीक है मैंने डेटाबेस पर विचार किया है, लेकिन मैं बस एक बहुत ही साधारण चीज़ (एक मानचित्र की तरह) चाहता था जो बहती हो सकती है आवश्यकतानुसार डिस्क। समस्या यह है कि हम कैसे जानते हैं कि कुंजी मौजूद है या नहीं, तो शायद इसे मानचित्र – Phil

+0

के "मान" भाग को ओवरफ़्लो करना होगा संभावित समाधान: मानचित्र का उपयोग करें, लेकिन वास्तविक मूल्य के बजाय केवल मूल्य संख्या को मूल्य के रूप में स्टोर करें। आप अपनी फ़ाइल से वास्तविक मूल्य पुनर्प्राप्त करने के लिए लाइन नंबर का उपयोग कर सकते हैं। – michael667

+0

माइकल - मैंने इसके बारे में सोचा और पढ़ने के लिए एक RandomAccessFile पाठक का उपयोग किया। दर्द BufferedReader फ़ाइल से वर्तमान पढ़ने की स्थिति की आपूर्ति नहीं कर सकता था। खोने वाले बुफेरड्रेडर का अर्थ है रीडलाइन क्षमता खोना और यह मेरे सीएसवी पार्सिंग के साथ भी गड़बड़ कर रहा है (मैंने मूल प्रश्न से इसे याद किया क्योंकि यह वास्तव में रिलीज़ नहीं था)। – Phil

2

आपकी विशाल फ़ाइल को डीबी में डंप करने जैसा लगता है।

ठीक है, मेरे पास इसी तरह की स्थिति थी। लेकिन, मेरे मामले में सबकुछ फ़ाइल प्रारूप में था और पूरे फाइल में एक ही प्रारूपित रेखाएं थीं। तो, मैंने जो किया है, मैंने बस फाइलों को कई टुकड़ों में विभाजित किया है (संभवतः, जो मेरा जेवीएम अधिकतम आकार को संसाधित करने में सक्षम हो सकता है)। फिर मैंने संसाधित होने के लिए फ़ाइलों को एक-एक करके बुलाया।

एक और तरीका, आप सीधे अपने डेटा को डेटाबेस में सीधे लोड कर सकते हैं।

0

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

संपादित करें: ध्यान दें कि हालांकि कई मैपरेडस परिचय कई नोड्स चलाने की क्षमता पर ध्यान केंद्रित करते हैं, फिर भी आपको एक मशीन पर स्मृति में सभी डेटा को पकड़ने के लिए आवश्यकता को दूर करने से लाभ प्राप्त करना चाहिए।

0

आपके पास कितनी मेमोरी है? जब तक आपके पास अधिकांश डेटा को स्मृति में रखने के लिए पर्याप्त स्मृति नहीं है, तो यह धीमा होने वाला है, यह असफल भी हो सकता है। एक कार्यक्रम जो भारी पेजिंग है 1000x धीमा या अधिक हो सकता है। कुछ पीसी में 16-24 जीबी है और आप अधिक स्मृति प्राप्त करने पर विचार कर सकते हैं।

मान लें कि पर्याप्त डुप्लीकेट हैं, आप अधिकांश डेटा को स्मृति में रख सकते हैं। मेरा सुझाव है कि आप अपने स्वयं के बनाने के बाइट आधारित स्ट्रिंग क्लास का उपयोग करें, क्योंकि आपके पास ASCII डेटा है और आप इन मानों को "स्ट्रिंग" प्रकारों में से एक के रूप में स्टोर करते हैं (एक विभाजक के साथ) आप पाते हैं कि आप मेमोरी में काम कर रहे डेटा को सेट कर सकते हैं।

+0

यदि आप हल्के वजन 'स्ट्रिंग' मार्ग पर जा रहे हैं, तो मैं ['MutableString'] (http://dsiutils.dsi.unimi.it/docs/it/unimi/dsi/lang/MutableString) की अनुशंसा करता हूं .html) वर्ग - यह इस उद्देश्य के लिए डिज़ाइन किया गया है। –

+0

MutableString एक char [] का उपयोग करता है, यहां तक ​​कि स्ट्रिंग एक बाइट [] '-XX: + UseCompressedStrings' का उपयोग करने के लिए ascii स्ट्रिंग को परिवर्तित कर सकता है जो कि नए JVMs पर डिफ़ॉल्ट है। हालांकि यह उतना ही कुशल नहीं है जितना आप स्वयं कर सकते हैं। मेमोरी डेटाबेस विकल्प में –

2

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

"ओवरहेड" आपको पीछे की तरफ रखेगा जब आपने हैश मैप समाधान में फिसल दिया है और यह पता चला है कि आउटऑफमेमरी अपवाद से बचने के लिए आपको अभी तक एक और अनुकूलन की आवश्यकता है, या फ़ाइल 50 जीबी नहीं है, लेकिन 75 ... वास्तव में, वहाँ मत जाओ।

3

एक नोएसक्यूएल डेटाबेस संभवतः सेटअप करना आसान होगा और यह मानचित्र के समान होगा। अब ओरेकल से बर्कलेडीबी जावा संस्करण की जांच करें। इसमें इंटरफ़ेस जैसे मानचित्र हैं, एम्बेड किए जा सकते हैं इसलिए कोई जटिल सेटअप की आवश्यकता नहीं है

+0

+1। – FloppyDisk

0

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

http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html

यह भी Maven में उपलब्ध है http://www.oracle.com/technetwork/database/berkeleydb/downloads/maven-087630.html

<dependencies> 
    <dependency> 
     <groupId>com.sleepycat</groupId> 
     <artifactId>je</artifactId> 
     <version>3.3.75</version> 
    </dependency> 
    </dependencies> 

    <repositories> 
    <repository> 
     <id>oracleReleases</id> 
     <name>Oracle Released Java Packages</name> 
     <url>http://download.oracle.com/maven</url> 
     <layout>default</layout> 
    </repository> 
    </repositories> 

यह भी विक्रेता लॉक-इन में से एक अन्य नुकसान (यानी आप के लिए कर रहे हैं इस उपकरण का उपयोग करने के लिए ced। हालांकि कुछ अन्य डेटाबेस में अन्य मानचित्र रैपर हो सकते हैं)

तो बस अपनी आवश्यकताओं के अनुसार चुनें।

0

अधिकांश कैश-एपीआई डिस्क पर मानचित्र और समर्थन ओवरफ्लो जैसे काम करते हैं। उदाहरण के लिए Ehcache इसका समर्थन करता है। या this tutorial for guave का पालन करें।

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