2010-08-06 15 views
9

मैं एक .net विंडोज़ फॉर्म ऐप में टेक्स्टबॉक्स में लॉट और बहुत से स्वरूपित टेक्स्ट का एक लॉग लिख रहा हूं।टेक्स्टबॉक्स में बड़ी मात्रा में टेक्स्ट लिखना

डेटा कुछ मेग्स पर पहुंचने के बाद धीमा हो जाता है। चूंकि मैं स्ट्रिंग को जोड़ रहा हूं, हर बार सही तरीके से फिर से आवंटित किया जाना चाहिए? मुझे केवल एक बार टेक्स्ट बॉक्स में मान सेट करने की आवश्यकता है, लेकिन मेरे कोड में मैं line+=data हजारों बार कर रहा हूं।

क्या ऐसा करने का कोई तेज़ तरीका है? शायद एक अलग नियंत्रण? क्या कोई लिंक सूची सूची प्रकार मैं उपयोग कर सकता हूं?

+6

आप स्ट्रिंगबिल्डर का उपयोग क्यों नहीं करते हैं, इस बीच आप संयोजित कर रहे हैं और एक बार आपका पूरा सेट टेक्स्टबॉक्स में ToString है। अगला? –

+1

@Alfred: ऐसा लगता है कि आपके सुझाव पर मामूली बदलाव सबसे कुशल है। भिन्नता यह है कि स्ट्रिंगबिल्डर का उपयोग उस पाठ को जमा करने के लिए किया जाएगा जिसे उसके बाद टेक्स्टबॉक्स में AppendText() के साथ जोड़ा गया है, जिसके बाद स्ट्रिंगबिल्डर को साफ़ किया गया है। –

उत्तर

7

स्ट्रिंगबिल्डर मदद नहीं करेगा यदि पाठ बॉक्स को वृद्धि के लिए जोड़ा गया है, उदाहरण के लिए लॉग आउटपुट की तरह।

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

नोट्स:

  1. (एक काउंटर या का उपयोग करें) एक वर्ग-दायरे वाले StringBuilder सदस्य (_sb)
  2. प्रारंभ एक टाइमर बनाएं
  3. संलग्न पाठ अपडेट _sb को
  4. जब टाइमर टिक्स या कुछ काउंटर रीसेट हो गया और टेक्स्ट बॉक्स
  5. # 1
से प्रक्रिया को पुनरारंभ करें
+1

जबकि आपका उत्तर निश्चित रूप से प्रासंगिक है, मुझे लगता है कि कथन * मुझे केवल एक बार टेक्स्ट बॉक्स में मान सेट करने की आवश्यकता है, लेकिन मेरे कोड में मैं लाइन + = डेटा दसियों बार कर रहा हूं। * इसका मतलब है कि यह एक नहीं होगा उसकी विशिष्ट समस्या का जवाब। – Marc

+2

@Marc: असल में, पॉल का जवाब बहुत अच्छा है। एक धागा एसबी को ताला लगा देता है, इसे जोड़ता है, अनलॉक करता है। यह कई बार कई बार करता है। यूआई थ्रेड प्रति सेकंड कुछ छोटी संख्या में मतदान कर सकता है, एसबी को लॉक कर सकता है, ToString प्राप्त कर सकता है और इसे साफ़ कर सकता है। इस तरह, यूआई अपडेट आवृत्ति concatenation आवृत्ति से पूरी तरह से स्वतंत्र है। –

5

StringBuilder के साथ अपने स्ट्रिंग को एक साथ बनाएं, फिर इसे toString() का उपयोग करके स्ट्रिंग में परिवर्तित करें, और इसे टेक्स्टबॉक्स पर असाइन करें।

+2

हो सकता है कि स्ट्रिंगबफर एक ऐसी कक्षा है जिसे मैंने कभी नहीं सुना है, लेकिन मैं यह सोच रहा हूं कि स्ट्रिंगबिल्डर –

+0

गलत भाषा है, 'स्ट्रिंगबफर' जावा है। =) – Marc

+0

हां, आप सही हैं, मैं जवाब संपादित कर दूंगा। – Frank

6

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

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

TextBox दिखाई देने के लिए, हालांकि इसमें बहुत अधिक डेटा है, तो आप इसे बताएंगे कि यह करता है। चूंकि उपयोगकर्ता चारों ओर स्क्रॉल करता है, तो आप अंतर्निहित स्रोत से प्रासंगिक डेटा के साथ बफर में डेटा को प्रतिस्थापित करेंगे (यादृच्छिक फ़ाइल पहुंच का उपयोग करके)। तो आपका यूआई एक फाइल की निगरानी करेगा, लॉगिंग घटनाओं को नहीं सुन रहा है।

बेशक, यह StringBuilder का उपयोग करने से बस बहुत अधिक काम है, लेकिन मैंने सोचा कि यह केवल मामले में उल्लेखनीय है।

+0

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

+1

@Steven: लेकिन 'टेक्स्टबॉक्स' में अभी भी सभी डेटा हैं, इस प्रकार आप अभी भी प्रतिबंधित हैं कि आपका डेटा कितना बड़ा हो सकता है। वर्चुअलाइजेशन उस से दूर हो जाता है क्योंकि यह केवल पूरे डेटा सेट की एक छोटी विंडो को देखता है। आप केवल डिस्क स्थान से ही सीमित हैं। –

+0

किसी भी लागत/लाभ विश्लेषण में लागत शामिल होनी चाहिए। वर्चुअलाइज्ड टेक्स्टबॉक्स बहुत कम उपयोगी है, क्योंकि आप Ctrl + A, Ctrl + C जैसी सरल चीजें भी नहीं कर सकते हैं। डेटाबेस तालिका से जुड़े ग्रिड जैसे मामलों में वर्चुअलाइजेशन उचित है। –

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