2010-04-19 9 views
7

मेरे पास स्ट्रिंग्स की एक सूची है जिसमें आकार 152 एमबी की टेक्स्ट फ़ाइल में लगभग 7 मिलियन आइटम हैं। मैं सोच रहा था कि एक फंक्शन को लागू करने का सबसे अच्छा तरीका क्या हो सकता है जो एक स्ट्रिंग लेता है और यह देता है कि यह तारों की सूची में है या नहीं।एक बड़ी पाठ फ़ाइल में एक स्ट्रिंग मिलान?

उत्तर

5

क्या आपको इस पाठ फ़ाइल के खिलाफ कई बार मिलान करना होगा? यदि ऐसा है, तो मैं HashSet<string> बनाउंगा। अन्यथा, बस लाइन से इसे लाइन पढ़ें (मुझे लगता है कि प्रति पंक्ति एक स्ट्रिंग है) और देखें कि यह मेल खाता है या नहीं।

एएससीआईआई का 152 एमबी यूनिकोड डेटा के 300 एमबी के रूप में खत्म हो जाएगा - लेकिन आधुनिक मशीनों में बहुत मेमोरी है, इसलिए HashSet<string> में पूरे लॉट को वास्तव में बार-बार लुकअप करना बहुत तेज़ होगा।

पूर्ण सरल यह करने के लिए जिस तरह से शायद, File.ReadAllLines उपयोग करने के लिए हालांकि कि एक सरणी जो तब को छोड़ दिया जाएगा पैदा करेगा है - स्मृति के उपयोग के लिए महान नहीं है, लेकिन शायद बहुत बुरा नहीं:

HashSet<string> strings = new HashSet<string>(File.ReadAllLines("data.txt")); 
... 

if (strings.Contains(stringToCheck)) 
{ 
    ... 
} 
+0

असल में मुझे बार-बार खोजना है। लेकिन मैं इसे वेब एप्लिकेशन में उपयोग करने जा रहा हूं। क्या स्मृति कई अनुरोधों के साथ एक मुद्दा बन जाएगा? –

+2

@ टाज़: अनुरोध की संख्या अप्रासंगिक है, जब तक आप केवल एक बार अपने हैशप को बनाते हैं :) दस्तावेज़ीकरण के अनुसार: * इस प्रकार के किसी भी सार्वजनिक स्थिर सदस्य थ्रेड सुरक्षित हैं *, इसलिए यहां कोई समस्या नहीं है, – tanascius

+0

@Taz : tanascius सही है। इसे एक बार लोड करें और आपको किसी भी अतिरिक्त मेमोरी उपयोग के बिना खोज करने में सक्षम होना चाहिए (एकाधिक समवर्ती धागे का उपयोग करना, यहां तक ​​कि जब तक कुछ भी लिख नहीं रहा हो)। जब तक आपके वेब सर्वर में सेट को पकड़ने के लिए पर्याप्त स्मृति हो, तब तक जाने का यह तरीका है। –

3

निर्भर करता है कि आप क्या करना चाहते हैं। जब आप बार-बार मैचों की खोज दोहराना चाहते हैं, तो मैं पूरी फ़ाइल को स्मृति में लोड करूंगा (HashSet में)। मैचों के लिए खोजना बहुत आसान है।

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