2012-08-06 14 views
7

का उपयोग कर विशाल फ़ाइलों की तुलना में मेरे पास दो बड़ी टेक्स्ट फ़ाइलें हैं जिनमें प्रत्येक 10 मिलियन से अधिक लाइनें हैं। मैं फ़ाइलों की तुलना कैसे कर सकता हूं और C++ का उपयोग कर फ़ाइलों में अलग-अलग पंक्तियां प्राप्त कर सकता हूं।सी ++

मैंने एक फ़ाइल को स्मृति में लोड करने का प्रयास किया है और स्मृति को सॉर्ट किया है और फ़ाइलों की तुलना करने के लिए बाइनरी पेड़ तर्क का उपयोग किया है। इसकी तुलना ने मुझे 20 सेकेंड में परिणाम दिया। लेकिन यह अधिक स्मृति का उपभोग कर रहा है। (पाठ फ़ाइल लगभग 500 एमबी है)।

मैं अधिक मेमोरी, एक अच्छा प्रदर्शन और हार्ड डिस्क पर कम से कम प्रभाव डालने के बिना दो फाइलों की तुलना करना चाहता हूं।

+7

पहला कदम एक भाषा चुनना है। सी और सी ++ के लिए समाधान अलग होंगे। – juanchopanza

+6

क्या एक diff उपकरण आपकी आवश्यकताओं को पूरा नहीं करेगा? पहिया को पुनर्निर्मित करने से आसान है। – user7116

+2

भाषा को सीपीपी –

उत्तर

4

आप दो पास विधि का उपयोग कर सकते हैं।

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

+0

मैं इसका सुझाव दे रहा था, लेकिन फिर मैंने सोचा कि जब हैश ** बराबर ** (लगभग हमेशा) पाठ को लाने के लिए तुलना सुनिश्चित करने के लिए आवश्यक हो सकता है। इस प्रकार यह बेवकूफ रणनीति शायद यह बहुत प्रभावी नहीं है। ओटीएच diff कुछ समान उपयोग करना चाहिए। – CapelliC

+0

यदि आप ब्रह्मांड समाप्त होने से पहले एक या दो बार गलती करते हैं तो आपको परवाह नहीं है, तो बस स्रोत लाइनों पर 128 बिट हैश कोड का उपयोग करें। 10 मिलियन लाइनों के लिए खराब तुलना करने की संभावना (1-2^(- 128)) * 10^7 ~~ 1-2^(- 103) है। पर्याप्त सुरक्षित लगता है। –

+0

@IraBaxter खैर, वास्तव में मुझे परवाह है;) और मुझे लगता है कि बहुत से लोग भी परवाह करते हैं। – FrostNovaZzz