2009-08-13 11 views
6

सर्वोत्तम प्रदर्शन प्राप्त करने के लिए अनुशंसित दृष्टिकोण क्या है जब हमें 10   एमबी से बड़ी टेक्स्ट फ़ाइलों को बनाने की आवश्यकता है?सी # में .NET के StreamWriter से मुझे सर्वश्रेष्ठ प्रदर्शन कैसे मिलता है?

कोड में कई अनुभाग हैं जिन्हें एक फ़ाइल में सामान लिखने की आवश्यकता है। इसका मतलब है कि बहुत सारी टेक्स्ट लाइनें हैं।

विकल्प # 1 (यह तर्क कई बार बुलाया जाएगा):

  1. एक StreamWriter उदाहरण
  2. बनाएं कुछ पंक्तियाँ लिखें (कुछ व्यापार तर्क के अनुसार)
  3. StreamWriter उदाहरण बंद

विकल्प # 2:

  1. प्रोग्राम की शुरुआत में स्ट्रीमवाइटर बनाएं
  2. कोड के अलग-अलग अनुभागों से सभी पंक्तियां लिखें।
  3. स्ट्रीमवाइटर को बहुत अंत में बंद करें जब कुछ और नहीं लिखा जाना चाहिए।

विकल्प # 3: कोई अन्य?

याद रखें कि आउटपुट फ़ाइल 10   एमबी से बड़ी हो सकती है।

उत्तर

13

एक लेखक को खोलना बार-बार खुलने और बंद करने से अधिक कुशल होगा। यदि यह महत्वपूर्ण डेटा है, तो आपको प्रत्येक लिखने के बाद Flush() पर कॉल करना चाहिए ताकि यह सुनिश्चित हो सके कि यह डिस्क पर हो।

क्या आपका प्रोग्राम बहु-थ्रेडेड है? यदि ऐसा है, तो आप एक निर्माता/उपभोक्ता कतार प्राप्त कर सकते हैं - कतार से लिखने और उन्हें लिखने के लिए एक ही थ्रेड लाने वाले आइटम हैं, फिर अन्य धागे स्वतंत्र रूप से कतार पर आइटम डाल सकते हैं।

क्या आप वाकई वास्तव में प्रदर्शन समस्या रखते हैं? 10 एमबी इन दिनों बहुत छोटा है ... मेरी नेटबुक पर अभी भी 10 एमबी लिखने के लिए केवल दो या दो लगते हैं (और नहीं, यह एक ठोस राज्य ड्राइव नहीं है)।

0

अपने टेक्स्ट को संयोजित करने के लिए स्ट्रिंगबिल्डर का उपयोग करें और फ़ाइल में केवल एक बार खोलें और लिखें।

+0

एक स्ट्रिंगबिल्डर पूरी फ़ाइल को स्मृति में संग्रहीत करेगा हालांकि। – David

+0

मेमोरी की 10 एमबी !? यह अनसुना है! ;-) –

0

दोनों परिदृश्य के 1 और 2 में आपको खुद से पूछना है कि फाइल के साथ-साथ पहुंच की आवश्यकता है या नहीं। परिदृश्य में इस मामले में 2 StreamWriter एक विकल्प नहीं है क्योंकि यह सिंक्रनाइज़ नहीं है। परिदृश्य 1 में आपको प्रत्येक स्ट्रीमवाइटर को इस तरह से खोलना चाहिए कि इसे फ़ाइल पर एक विशेष लॉक मिल जाए।

अनुक्रमिक पहुंच मानते हुए, मैं परिदृश्य 2 के साथ कभी नहीं जाऊंगा। इसे कोड के प्रत्येक अनुभाग में आपके स्ट्रीमवाइटर के चारों ओर गुजरने की आवश्यकता है। और लेखक को फिर से बंद करने के लिए कौन जिम्मेदार है। यह जल्दी से असंभव हो जाएगा।

परिदृश्य 1 का नुकसान यह है कि आपको एक स्ट्रीमवाइटर खोलना होगा जहां आपको एक की जरूरत है, जो भी अनजान हो जाता है। इसके अलावा, अब आपको फ़ाइल के स्थान के प्रत्येक कोड अनुभाग में जानना होगा।

मैं स्ट्रीमवाइटर के चारों ओर एक सिंगलटन रैपर के लिए जाऊंगा ताकि आप स्ट्रीमवाइटर पर कई निर्भरताओं को बनाए बिना इसे हर जगह इस्तेमाल कर सकें।

0

बस दोनों दृष्टिकोणों को मिलाएं ... एक बफर का उपयोग करें जो आपको स्मृति में जितना चाहें उतना स्टोर करने की अनुमति देता है। एक बार उस आकार से अधिक हो जाने पर, आपका बफर डिस्क पर और साफ़ किया जाएगा।

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