2013-04-26 12 views
5

मैं एक साधारण जावा एप्लिकेशन बना रहा हूं जिसमें एक सीएसवी फ़ाइल से जानकारी पढ़ना शामिल है। csv फ़ाइल में जानकारी इस रूप में आता है:जावा में 2 बड़ी टेक्स्ट फ़ाइलों को सॉर्ट करने का सबसे अच्छा तरीका क्या है?

"ID","Description" 
"AB","Some sort of information for AB" 
"AC","Some sort of information for AC" 

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

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

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

हालांकि, इसका मतलब यह होगा कि कोड 2 अलग छंटाई प्रदर्शन के दो अलग-अलग ब्लॉक नहीं होगा। इसलिए बनाए रखने की आवश्यकता वाले कोड की मात्रा में वृद्धि। यदि आप इस एप्लिकेशन को लिखेंगे तो क्या आप 2 अलग कोड कोड लिखने पर विचार करेंगे जो एक छोटी सीएसवी फ़ाइल को संभालेगा, और एक बड़ी सीएसवी फ़ाइल अलग से। या आप फ़ाइल आकार के अनियंत्रित बाहरी विलय प्रकार का उपयोग कर फ़ाइल को सॉर्ट करेंगे?

या क्या इस दृष्टिकोण का कोई विकल्प है?

धन्यवाद।

+1

यह एक डिज़ाइन प्रश्न है जो बहस और कई मान्य प्रस्तावों का कारण बन सकता है। यह http://programmers.stackexchange.com के लिए बेहतर फिट हो सकता है। मैंने यहां "रचनात्मक नहीं" के रूप में बंद करने के लिए वोट दिया है। –

+0

@ डंकन जोन्स हाय, मैं प्रोग्रामर.स्टैकएक्सchange.com पर माइग्रेट करने के लिए खुश हूं। एक बार जब मैं यह पता लगाता हूं कि – zfranciscus

+0

@ डंकनजोन्स कैसे करें, हालांकि मेरे पास स्टैक ओवरफ़्लो में 824 प्रतिष्ठा है, तो प्रोग्रामर.स्टैकएक्सchange.com पर केवल 113 प्रतिष्ठा है। यही कारण है कि मैं इस प्रश्न को प्रोग्रामर पर नहीं माइग्रेट कर सकता हूं। Reackexchange.com – zfranciscus

उत्तर

3

सीएसवी खुद फ़ाइल को पार्स,, मूल्य रिकॉर्ड के रूप में बाइट लंबाई है कि लाइन के लिए TreeMap के लिए एक ही आईडी स्तंभ जोड़ने। संबंधित लाइनों को पढ़ने के लिए प्रिंटिंग के बाद RandomAccessFile का उपयोग करें। यदि यह दृष्टिकोण अभी भी आपकी याददाश्त को बहता है, तो MapDB पर एक नज़र डालें। यह ट्रीमैप कार्यान्वयन प्रदान करता है जो डिस्क पर निर्बाध रूप से बहती है और इसमें बहुत अच्छा प्रदर्शन होता है।

+0

मुझे MapDB के बारे में सूचित करने के लिए धन्यवाद। मैं अपने कार्यक्रम के लिए उस एपीआई का पता लगाऊंगा :) – zfranciscus

1

यह आपके मालिक/ग्राहक पर निर्भर करता है कि इसके लिए कितने समय संसाधन आवंटन हैं। यदि यह कोई समस्या नहीं है, तो निश्चित रूप से कोड के 2 भाग के साथ एक अनुकूलित संस्करण की आवश्यकता है: छोटी फ़ाइलों के लिए त्वरित स्मृति क्रम और बड़ी फ़ाइलों के लिए बाहरी प्रकार के लिए।

ग्राहक एक त्वरित समाधान चाहते हैं, की तुलना में आप उसे पूछ सकते हैं: आप चाहते हैं एक धीमी गति से समाधान जो असीमित फ़ाइल आकार के साथ काम करेंगे या आप एक तेजी से चल रहा है समाधान है जो एक स्मृति सीमा होती है करना चाहते हैं? - और आपको वह प्रतिक्रिया मिलेगी जैसा वह चाहता है और वह ठीक होगा :) - यदि ग्राहक संतुष्ट है तो भी आप के लिए।

हो सकता है कि वह एक कार्यान्वयन हैं: अगर सॉफ्टवेयर पूरी तरह से भुगतान किया जाता है, की तुलना में यह इतने पर अधिकतम 1GB के साथ ही फ़ाइलों की अनुमति और होगा।

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

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