2011-06-11 4 views
10

में बड़े डेटासेट पर फ़ाइल आधारित विलय सॉर्ट स्मृति में फिट नहीं होने वाले बड़े डेटासेट दिए गए हैं, क्या जावा में सॉर्ट करने के लिए कोई लाइब्रेरी या एपीआई है? कार्यान्वयन संभवतः लिनक्स उपयोगिता प्रकार के समान होगा।जावा

उत्तर

14

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

1) के रूप में ज्यादा डेटा पढ़ें के रूप में मुख्य स्मृति में फिट होगा, मान लें कि यह 1 जीबी

2) quicksort है कि 1 जीबी (चलो यहाँ है जहाँ आप संग्रह ढांचे से जावा के अंतर्निहित प्रकार)

3) लिखें कि "के रूप में हिस्सा -1"

4) चरण दोहराएं 1-3 जब तक आप है डिस्क के लिए 1 जीबी अनुसार क्रमबद्ध का उपयोग करेंगे एक अलग फ़ाइल में प्रत्येक डेटा खंड को सहेजने, सभी डेटा के माध्यम से चला गया। तो यदि आपका मूल डेटा 9 जीबी था, तो अब आपके पास "चंक -9" लेबल किए गए डेटा के 9 क्रमबद्ध भाग होंगे, "चंक -9"

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

6) एक बार चरण 5 सभी डेटा आप कर चुके हैं पढ़ने समाप्त हो गया है - अपने आउटपुट फ़ाइल अब एक पूरी तरह से हल कर डेटा सेट

इस दृष्टिकोण आप आसानी से अपने खुद के एक सामान्य "megasort" उपयोगिता लिख ​​सकता है के साथ शामिल जो एक फ़ाइल नाम और maxMemory पैरामीटर लेता है और temp फ़ाइलों का उपयोग कर फ़ाइल को कुशलतापूर्वक टाइप करता है। मैं शर्त लगाता हूं कि इसके लिए आपको कम से कम कुछ कार्यान्वयन मिल सकते हैं, लेकिन यदि आप ऊपर वर्णित अनुसार अपना खुद का रोल नहीं कर सकते हैं।

+2

मुझे इस विधि के साथ एक आलेख मिला है और जावा कोड भी शामिल है: http://www.codeodor.com/index.cfm/2007/5/10/Sorting-really-BIG-files/1194 – Franck

0

बड़े डेटासेट को संभालने का सबसे आम तरीका स्मृति में है (आप इन दिनों 1 टीबी के साथ एक सर्वर खरीद सकते हैं) या डेटाबेस में।

यदि आप डेटाबेस का उपयोग नहीं कर रहे हैं (या अधिक मेमोरी खरीदते हैं) तो आप इसे आसानी से निष्पक्ष लिख सकते हैं।

ऐसे पुस्तकालय हैं जो मानचित्र-न्यूनीकरण कार्यों को करने में मदद कर सकते हैं लेकिन वे सहेजने से अधिक जटिलता जोड़ सकते हैं।