मानों की तालिका करने के लिए सरल आईडी के लिए कुशल स्थायी भंडारण जावा के लिए नक्शे

वोट
5

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

यह काफी आसानी से सरल एसक्यूएल के रूप में लागू किया जा सकता है, लेकिन वहाँ की समस्याओं की एक जोड़ी है, अर्थात् मैं के रूप में ज्यादा संभव के रूप में डिस्क पर इस संरचना के आकार को संपीड़ित करने की जरूरत है। (क्योंकि मूल्यों की राशि का मैं भंडारण कर रहा हूँ) इसके अलावा, यह व्यवहार नहीं, मैं सिर्फ एक बार लिख सकते हैं और बस को पढ़ने के लिए पूरे तालिका की सामग्री, जरूरत है तो एक संबंधपरक DB वास्तव में एक बहुत अच्छा फिट नहीं है।

अगर किसी को भी किसी भी अच्छे सुझाव था मैं सोच रहा था? किसी कारण से मैं कुछ सभ्य एटीएम साथ आने के लिए नहीं कर पा रहे। विशेष रूप से जावा में एक API के साथ कुछ अच्छा होगा।

12/03/2009 को 16:11
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


7 जवाब

वोट
3

इस के लिए एक नौकरी की तरह लगता है .... new ObjectOutputStream(new FileOutputStream(STORAGE_DIR + "/" + key + ".dat");!!

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

एक सभ्य फ़ाइल पर प्रणाली राईट परमाणु बनाया जा सकता है (एक अस्थायी फ़ाइल के लिए लिख और फिर फ़ाइल का नाम बदलने से); पढ़ने / लिखने की गति Mbit / सेकंड की 10s में मापा जाता है; देखो अप एक सरल निर्देशिका वृक्ष की तरह बनाने के द्वारा बहुत ही कुशल बनाया जा सकता है STORAGE_DIR + "/" + key.substring(0,2) + "/" + key.substring(0,4) + "/" + keyजो अभी भी और भी अधिक कुशल प्रविष्टियों के लाखों लोगों के साथ कुशल होना चाहिए, अगर आपके फाइल सिस्टम अनुक्रमित निर्देशिका उपयोग करता है; अंत में इसकी भी तेजी से retrievals के लिए इस के शीर्ष पर एक स्मृति समर्थित LRU कैश लागू करने के लिए तुच्छ।

संपीड़न के बारे में - आप इससे पहले कि आप की दुकान डेटा के लिए एक gzip या यहाँ तक कि bzip2 संपीड़न प्रभावित करने के लिए जकार्ता के कॉमन्स-संपीड़ित उपयोग कर सकते हैं। लेकिन इस एक अनुकूलन समस्या है और अपने आवेदन और उपलब्ध डिस्क स्थान के आधार पर आप CPU चक्र कहीं और निवेश से बेहतर हो सकता है।

: यहाँ एक नमूना कार्यान्वयन है कि मैं बनाया है http://geek.co.il/articles/geek-storage.zip । कि भंडारण और एक सेट अधिकतम आकार के साथ एक कैश से वस्तुओं को पुन: प्राप्त करने के लिए तरीके प्रदान करता है - यह एक सरल अंतरफलक (अपने बस अवधारणा का एक प्रदर्शन है जो साफ किया जा रहा से दूर) का उपयोग करता है। एक कैश याद आती है से निपटने के लिए एक उपयोगकर्ता कार्यान्वयन में स्थानांतरित किया जाता है, और कैश समय-समय पर जाँच करेगा कि यह भंडारण आवश्यकताओं से अधिक नहीं है और पुराने डेटा निकल जाएगा।

मैं भी पूरा करने के लिए एक MySQL समर्थित कार्यान्वयन और डिस्क आधारित और MySQL आधारित कार्यान्वयन की तुलना करने के लिए एक मानक के शामिल थे। मेरे घर मशीन (एक पुराने Athlon 64) डिस्क बेंचमार्क स्कोर बेहतर तो से दो गुनी संलग्न बेंचमार्क में MySQL कार्यान्वयन के रूप में (9.01 सेकंड बनाम 18.17 सेकंड) पर। हालांकि डीबी कार्यान्वयन शायद थोड़ा बेहतर प्रदर्शन के लिए बदलाव कर सकते हैं, मेरा मानना ​​है कि यह समस्या काफी अच्छी तरह से दर्शाता है।

इस का उपयोग करने के आप मनचाहे ढंग से स्वतंत्र महसूस।

12/03/2009 को 16:28
का स्रोत उपयोगकर्ता

वोट
2

मैं प्रयोग करेंगे ehcache , यह हाइबरनेट और अन्य जावा ईई पुस्तकालयों द्वारा प्रयोग किया जाता है, और वास्तव में सरल और प्रभावी है:

एक मेज जोड़ने के लिए:

List<List<Integer>> myTable = new(...)
cache.put(new Element("myId", myTable));

पढ़ने के लिए:

List<List<Integer>> myTable = (List<List<Integer>>) cache.get("myId").getObjectValue();
12/03/2009 को 16:29
का स्रोत उपयोगकर्ता

वोट
1

अपाचे डर्बी एक अच्छा फिट अगर आप कुछ एम्बेडेड (नहीं एक अलग सर्वर) चाहते हो सकता है।

वहाँ कम से अन्य विकल्पों की एक सूची है जावा में हल्के डाटा बेस

12/03/2009 को 16:47
का स्रोत उपयोगकर्ता

वोट
1

आप पर ध्यान दिया है बर्कले DB ? यही कारण है कि जैसे कि यह बिल फिट हो सकता लग रहा है।


संपादित करें:

मैं जोड़ने के लिए इससे पहले कि आप उन्हें स्टोर मूल्यों खुद को gzip कर सकते हैं भूल गया। तो बस उन्हें अनज़िप जब आप उन्हें पुनः प्राप्त।

12/03/2009 को 16:14
का स्रोत उपयोगकर्ता

वोट
0

आप KB की एक जोड़ी है, तो मुझे समझ नहीं आता क्यों आपको लगता है कि डिस्क स्थान की लागत की 181 एमबी 1 प्रतिशत, मैं इस से कि कुछ भी कम सुझाव है कि "डिस्क पर इस संरचना के आकार के रूप में ज्यादा संभव के रूप में संक्षिप्त" को देखते हुए की जरूरत है बहुत अधिक समय खर्च करने के बारे में चिंता के लायक नहीं है।

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

XMLEncoder xe = new XMLEncoder(
    new GZIPOutputStream(
        new FileOutputStream(filename+".xml.gz")));
xe.writeObject(map);
xe.close();
04/04/2009 को 12:00
का स्रोत उपयोगकर्ता

वोट
0

आप उपयोग कर सकते हैं JOAFIP http://joafip.sourceforge.net/ यह आप फ़ाइल में अपने सभी डेटा मॉडल डाल करने में सक्षम बनाने के लिए और आप स्मृति में सभी को पुन: लोड के बिना यह करने के लिए उपयोग कर सकते हैं, इसे अद्यतन,।

03/04/2009 को 23:59
का स्रोत उपयोगकर्ता

वोट
0

ऐसा लगता है कि कुंजी => मूल्य डेटाबेस बात आप के लिए खोज कर रहे हैं।

हो सकता है कि SuperCSV आपके लिए सबसे अच्छा रूपरेखा है!

आप एक संबंधपरक डेटाबेस का उपयोग नहीं करना चाहते, तो आप उपयोग कर सकते हैं JAXB एक्सएमएल फाइल के रूप में अपने वस्तुओं की दुकान करने के लिए!

वहाँ भी जैसे अन्य पुस्तकालयों के साथ एक तरीका है Xstream

आप XML पसंद करते हैं, तो JAXB या Xstream का उपयोग करें। नहीं तो आप इस तरह के रूप में SuperCSV सीएसवी पुस्तकालयों पर एक नजर है चाहिए। लोग धारावाहिक जावा फाइलों के साथ जीवन Guss तरह डिफ़ॉल्ट हठ तंत्र का उपयोग कर सकते कर सकते हैं, जो कहा। प्रत्यक्ष जावा हठ सबसे तेज़ तरीका हो सकता है।

12/03/2009 को 17:09
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more