2012-02-09 21 views
5

मेरे पास एक फ़ाइल है जिसमें कुछ निश्चित संख्या वाली निश्चित लंबाई पंक्तियां हैं। मुझे उस नंबर को प्राप्त करने और उन्हें संसाधित करने और फ़ाइल में लिखने के लिए प्रत्येक पंक्ति को पढ़ने की आवश्यकता है। चूंकि मुझे प्रत्येक पंक्ति को पढ़ने की आवश्यकता है, क्योंकि पंक्तियों की संख्या बढ़ जाती है, यह समय लेने वाली हो जाती है।फ़ाइल पढ़ने का सबसे प्रभावी तरीका

क्या फ़ाइल की प्रत्येक पंक्ति पढ़ने का कोई प्रभावी तरीका है? मैं सी # का उपयोग कर रहा हूँ।

+4

स्टैक ओवरव्लो पर निर्भर करता है। –

+0

क्या आप 4.0 या 2/3.5 पर हैं? –

उत्तर

0

फ़ाइल से सभी पंक्तियों को पढ़ना हमेशा कम से कम ओ (एन) होता है। जब फ़ाइल का आकार कोई समस्या बनना शुरू होता है तो संभवतः फ्लैट फ़ाइलों की बजाय जानकारी के लिए डेटाबेस बनाने के लिए यह एक अच्छा समय है।

+0

अच्छी तरह से फाइलें बाहरी हार्डवेयर का परिणाम हैं जो फाइलों के रूप में और वास्तव में बड़ी संख्या में फाइलें होंगी .... फाइलों को कुशलता से पढ़ने का कोई भी तरीका सराहना की जाएगी – Jay

14

File.ReadLines (.NET 4.0+) शायद ऐसा करने का सबसे मेमोरी प्रभावी तरीका है।

यह IEnumerable<string> का अर्थ है जिसका अर्थ है कि स्ट्रीमिंग फैशन में लाइनें आलसी हो जाएंगी।

पिछले संस्करणों में स्ट्रीमिंग विकल्प इस तरीके से उपलब्ध नहीं है, लेकिन लाइन द्वारा लाइन पढ़ने के लिए StreamReader का उपयोग करके वही प्राप्त होगा।

+1

यह केवल .NET 4 या अधिक से अधिक। बस कुछ इंगित करने के लिए, सुनिश्चित नहीं है कि ओपी क्या उपयोग कर रहा है। –

+0

@AaronMcIver - अच्छा बिंदु। उत्तर अपडेट किया गया। – Oded

+0

मुझे पूरा यकीन था कि मैंने 3.5 में इसका इस्तेमाल किया हो सकता है यह फ़ाइल हो सकता है। रीड एलेक्स्ट जो स्ट्रिंग ऐरे – Venki

0

सुनिश्चित नहीं हैं कि इस सबसे कारगर है, लेकिन यह मेरे लिए अच्छी तरह से काम करता है: कोई फर्क नहीं पड़ता, जो ऑपरेटिंग सिस्टम का उपयोग कर रहे http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx

//Declare a new file and give it the path to your file 
    FileInfo fi1 = new FileInfo(path); 

    //Open the file and read the text 
    using (StreamReader sr = fi1.OpenText()) 
    { 
     string s = ""; 
     // Loop through each line 
     while ((s = sr.ReadLine()) != null) 
     { 
      //Here is where you handle your row in the file 
      Console.WriteLine(s); 
     } 
    } 
+0

देता है, इसके बाद मैं कंसोल पर लाइन लिखने के बजाय इसके बाद क्या करता हूं, लाइन को एक ऐरे में परिवर्तित करता है और डेटा आयात करता है डेटाबेस तालिका में। लगता है कि टैब सीमित फ़ाइल के माध्यम से बहुत तेजी से दौड़ने लगता है लेकिन मुझे शायद ही कभी इसके साथ कुछ हज़ार से अधिक रिकॉर्ड्स से गुजरना पड़ेगा। –

+0

जब तक आप StreamReader के साथ कुछ खास नहीं कर रहे हैं, जो इस उदाहरण में आप नहीं हैं, तो आप केवल 'foreach (फ़ाइल में। लाइन लाइनों (पथ) में var पंक्ति) लिख सकते हैं {Console.WriteLine (रेखा); } '। – Philip

0

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

समय फ़ाइल पर कार्रवाई करने में कोई समस्या बनता जा रहा है, तो आपके पास दो विकल्प है कि मदद कर सकता है कर रहे हैं: कम फ़ाइलों का उपयोग करने के लिए व्यवस्था करने के लिए

  1. प्रयास करें। ऐसा लगता है कि आप लॉग फ़ाइलों या कुछ को संसाधित कर रहे हैं - आपके प्रोग्राम को अधिक बार चलाने से कम से कम बेहतर प्रदर्शन की उपस्थिति में मदद मिल सकती है।

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

शुभकामनाएं।

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