2016-11-21 11 views
6

मेरे पास निम्न समस्या है। मैं कुछ जगह और एपीआई का उपयोग कर कनेक्ट कर रहा हूं और डेटा को इनपुटस्ट्रीम के रूप में प्राप्त कर रहा हूं। लक्ष्य डुप्लिकेट लाइनों को हटाने के बाद डेटा को सहेजना है। कॉलम 10, 15, 22 द्वारा परिभाषित डुप्लिकेशन।बड़े पैमाने पर जावा पर डुप्लिकेट को हटाने

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

मैं हैश नक्शे का उपयोग के बारे में पढ़। लेकिन मुझे यकीन नहीं है कि इसका उपयोग करने के लिए मेरे पास पर्याप्त स्मृति है।

क्या किसी के पास इस समस्या को हल करने का सुझाव है?

+1

क्या आपके पास अपने एपीआई द्वारा दिए गए आउटपुट का एक उदाहरण है? और तीन स्तंभों (10,15,22) के संयोजन द्वारा परिभाषित डुप्लिकेशन है या इनमें से प्रत्येक कॉलम को दूसरों के संदर्भ के बिना अद्वितीय होना चाहिए? –

+0

एपीआई का आउटपुट एक स्ट्रिंग जैसा है: = "banna", = "नारंगी", = "सेब" ... आदि लगभग 30 तत्व। इन कॉलम का संयोजन कुंजी है। – mikeP

उत्तर

0

आप ConcurrentHashSet उपयोग कर सकते हैं। यह स्वचालित रूप से डुप्लिकेट तत्व को हटा देगा और यह थ्रेड एक निश्चित सीमा तक सुरक्षित होगा

+0

मेमोरी सीमा क्या है? क्या यह मेरे पास मौजूद डेटा की मात्रा को संभालेगा? – mikeP

1

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

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

जब आप एक हैश मैच हिट करते हैं, तो मूल मान देखें और जांचें कि यह समान है (जैसा कि विभिन्न मानों के लिए हैश एक साथ गिर सकते हैं)।

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

यदि आप कई मैचों की अपेक्षा करते हैं, तो शायद यह एक अन्य तरीका है, यानी एक अनुक्रमित फ़ाइल या फाइलों का सेट, या यहां तक ​​कि एक डेटाबेस (सुनिश्चित करें कि यह एक डेटाबेस है जहां लेखन संचालन बहुत महंगा नहीं है)।

+0

क्या होगा यदि मैंने कुंजी को है और इसे किसी सूची (या एक लिंक्डलिस्ट) में डाला है और यदि हैश मौजूद है तो सूची की जांच करेगा यदि नहीं, तो मैं सीधे लक्ष्य फ़ाइल पर लिखूंगा और यदि यह अस्तित्व में है तो मैं अनदेखा करूँगा? मुझे लगभग 2 मिलियन अद्वितीय रिकॉर्ड होने के अलावा। – mikeP

+0

जैसा कि @lexicore का उल्लेख है, आपके पास हैश टकराव हो सकता है, यानी दो अलग-अलग मानों में एक ही हैश हो सकता है। यदि आप अपने उपयोग के मामले के लिए एक विशेष हैश फ़ंक्शन के साथ आ सकते हैं जो हैश टकराव से बचने की गारंटी है, तो आप जो भी वर्णन कर सकते हैं वह कर सकते हैं। अन्यथा, एक बार जब आप एक समान हैश पाते हैं, तो आपको वास्तविक अंतर्निहित मानों की तुलना करना होगा। एक अपवाद एक उपयोग केस होगा जहां कुछ अद्वितीय प्रविष्टियों को छोड़ना स्वीकार्य था (बल्कि असामान्य परिदृश्य)। –

1

समाधान कितना बड़ा स्तंभ 10, 15 में अपने डेटा, 22.

यह मान लिया जाये कि बहुत बड़ा (जैसे कि, सीए 1KB) आप वास्तव में एक में स्मृति समाधान लागू कर सकते हैं नहीं कर रहा है है पर निर्भर करता है।

  • कॉलम 10, 15 से मूल्यों को स्टोर करने के लिए, 22. ध्यान equals और hashCode तरीकों को लागू करने के लिए एक Key वर्ग को लागू करें। (आप इसके बजाय सामान्य ArrayList का भी उपयोग कर सकते हैं।)
  • Set बनाएं जिसमें आपके द्वारा पढ़े गए सभी रिकॉर्ड की कुंजी शामिल होंगी।
  • गये प्रत्येक रिकॉर्ड को पढ़ने के लिए, जाँच अगर यह कुंजी है कि सेट में पहले से ही है। यदि हां, तो रिकॉर्ड छोड़ दें। यदि नहीं, तो आउटपुट में रिकॉर्ड लिखें, सेट में कुंजी जोड़ें। सुनिश्चित करें कि आप थ्रेड-सुरक्षित तरीके से सेट के साथ काम करते हैं।

सबसे बुरी स्थिति में आपको number of records * size of key स्मृति की आवश्यकता होगी।10000000 रिकॉर्ड और अनुमानित < प्रति किलो 1kb के लिए यह लगभग 10GB के साथ काम करना चाहिए।

यदि कुंजी का आकार अभी भी बहुत बड़ा है, तो आपको शायद कुंजी के सेट को स्टोर करने के लिए डेटाबेस की आवश्यकता होगी।

एक और विकल्प पूर्ण कुंजी की बजाय कुंजी की हैश संग्रहित करेगा। इसके लिए बहुत कम स्मृति की आवश्यकता होगी लेकिन आपको हैश टकराव मिल रहा है। इससे "झूठी सकारात्मक" हो सकती है, यानी झूठी डुप्लिकेट जो वास्तव में डुप्लीकेट नहीं हैं। पूरी तरह से इससे बचने के लिए आपको एक डेटाबेस की आवश्यकता होगी।

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