2014-05-06 5 views
7

में एक बड़ी टेक्स्ट फ़ाइल खींचने का सबसे तेज़ तरीका मेरे पास एक बड़ी टेक्स्ट फ़ाइल (~ 100 एमबी) है जो मैं स्ट्रिंग्स की सूची में अपनी लाइनें रखता हूं। मेरे विनफॉर्म को कभी-कभी इसका एक हिस्सा दिखाने की आवश्यकता होती है, उदाहरण के लिए 500,000 लाइनें।सी # Winforms

मैंने लिस्टबॉक्स, रिचटेक्स्टबॉक्स और टेक्स्टबॉक्स का उपयोग करने का प्रयास किया है, लेकिन ड्राइंग में बहुत अधिक समय लगता है।

उदाहरण के लिए, टेक्स्टबॉक्स में 500,000 लाइनें दिखाने के लिए 25 सेकंड लगते हैं, जबकि नोटपैड तुरंत इस आकार की एक टेक्स्ट फ़ाइल खोलता है।

इस उद्देश्य के लिए सबसे तेज़ समाधान क्या होगा?

+0

आपने सही नियंत्रण की कोशिश की, लेकिन गलत मोड में। "Winforms ** वर्चुअल मोड ** " खोजें (उदाहरण के लिए, सूची बॉक्स)। – Sinatr

उत्तर

10

फ़ाइल स्ट्रीम क्यों नहीं खोलें और केवल कुछ ही पंक्तियां पढ़ें। आप seek का उपयोग कर सकते हैं क्योंकि उपयोगकर्ता फ़ाइल में स्क्रॉल करता है और उचित लाइनों को प्रदर्शित करता है। मुद्दा यह है कि - पूरी फ़ाइल को स्मृति में पढ़ने में बहुत समय लगता है इसलिए ऐसा नहीं करें!

स्टार्टर कोड

निम्नलिखित एक छोटी कोड स्निपेट कि पूरा नहीं हुआ है है, लेकिन यह कम से कम आप कार्य आरंभ कर देना चाहिए:

// estimate the average line length in bytes somehow: 
int averageLineLengthBytes = 100; 

// also need to store the current scroll location in "lines" 
int currentScroll = 0; 

using (var binaryReader = new StreamReader(new FileStream(fileName, FileAccess.Read))) 
{ 
    if (binaryReader.BaseStream.CanSeek) 
    { 
     // seek the location to read: 
     binaryReader.BaseStream.Seek(averageLineLengthBytes * currentScroll, SeekOrigin.Begin); 

     // read the next few lines using this command 
     binaryReader.ReadLine(); 
    } 
    else 
    { 
     // revert to a slower implementation here! 
    } 
} 

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

एक नोट वर्चुअल मोड के बारे में

आभासी मोड जरूरत आधार के रूप में एक पर आइटम लोड करने के लिए एक ListBox या इसी तरह की सूची नियंत्रण का उपयोग करने का एक तरीका है। जब उपयोगकर्ता नियंत्रण में स्क्रॉल करता है तो नियंत्रण किसी सूचकांक के आधार पर आइटम पुनर्प्राप्त करने के लिए कॉलबैक निष्पादित करेगा। यह केवल एक व्यवहार्य समाधान है यदि आपका डेटा निम्नलिखित मानदंडों को पूरा करता है:

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

यदि आप इन मानदंडों को पूरा नहीं कर सकते हैं, तो वर्चुअल मोड विशेष रूप से सहायक नहीं होगा। seek के साथ प्रस्तुत उत्तर इस बात पर ध्यान दिए बिना काम करेगा कि आप इन क्रियाओं को कर सकते हैं या नहीं। बेशक, यदि आप इन न्यूनतम मानदंडों को पूरा कर सकते हैं, तो हर तरह से - सूची दृश्यों के लिए वर्चुअल मोड देखें और आपको कुछ वास्तव में उपयोगी जानकारी मिलनी चाहिए!

+0

आप वर्चुअलाइजेशन का उपयोग क्यों नहीं कर रहे हैं, जैसे @ ब्लैक फ्रॉम सुझाव दे रहा है (और WPF पर भी उपलब्ध है) –

+1

@YishaiGalatzer "वर्चुअलाइजेशन" जैसा कि आप कॉल करते हैं, यह एक सूची दृश्य * IF * के साथ काम करेगा * आप समय से पहले आइटम की सटीक संख्या जानते हैं । यह डेटा को किसी भी तरह से वांछित तरीके से प्रदर्शित करने की अनुमति देने के बजाय केवल एक विशिष्ट इंटरफ़ेस विकल्प पर प्रतिबंधित करता है। इन दोनों तथ्यों के आधार पर मैंने उन लोगों को समझाया जो एक सामान्य फ़ाइल रीडर के रूप में समाधान के अच्छे नहीं हैं जिन्हें ओपी चाहता है जो भी करने के लिए संशोधित किया जा सकता है! –

+0

@YishaiGalatzer वर्चुअल मोड के पेशेवरों/विपक्ष की व्याख्या करने के उत्तर में एक नोट जोड़ा गया:) –

1

ListView में Virtual Mode संपत्ति है। यह आपको Retrieve Virtual Item Event का उपयोग करके केवल डेटा लोड करने की अनुमति देता है। तो जब यह घटना आइटम संख्या 40,000 के लिए ट्रिगर होती है उदाहरण के लिए, आप लाइन में पढ़ने वाली फ़ाइल पर एक खोज करेंगे।

आप example of a virtual list box on Microsoft भी पा सकते हैं। यह वास्तव में पुराना है, लेकिन यह आपको एक बुनियादी विचार देता है।