2010-05-12 8 views
9

पढ़ने पर विभिन्न सवालों के पढ़ने और स्ट्रीम लेखन के बाद लिखते हैं, सभी विभिन्न जवाब सही तरीका यह करने के लिए के रूप में कुछ इस तरह परिभाषित करते हैं:का उपयोग क्यों करें बफ़र्स को पढ़ने के लिए/स्ट्रीम

private void CopyStream(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[16 * 1024]; 
    int read; 
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, read); 
    } 
} 

दो सवाल:

इन छोटे हिस्सों में क्यों पढ़ और लिखते हैं?

बफर आकार का महत्व क्या है?

उत्तर

6

आप एक समय में एक बाइट पढ़ा है, तो हर बाइट आप कॉल उदाहरण के लिए समारोह बुला बाइट पढ़ने के लिए की भूमि के ऊपर, और अतिरिक्त ओवरहेड्स (, याद करने के लिए जहां फाइल में आप कर रहे हैं एक fileposition += 1 कर , जांच कर रहे हैं कि क्या आप फ़ाइल के अंत तक पहुंच चुके हैं, और इसी तरह)

यदि आप 4000 बाइट्स पढ़ते हैं, तो आपके पास एक ही ओवरहेड्स (उपर्युक्त उदाहरण में, 1 फ़ंक्शन कॉल, एक ऐड (फ़ाइलपॉशन + = 4000) , और एक जांच यह देखने के लिए कि क्या आप फ़ाइल के अंत में हैं या नहीं। तो ओवरहेड के मामले में, आपने इसे 4000 गुना तेज कर दिया है। (असल में, अन्य लागतें हैं ताकि आप उस बड़े ए को नहीं देख सकें लाभ, लेकिन आपने ओवरहेड में भारी कटौती की है)

बेशक, आप पूरी फ़ाइल के रूप में एक बफर बना सकते हैं, और पूर्ण न्यूनतम ओवरहेड प्राप्त कर सकते हैं। हालांकि:

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

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

  • आपको कम रिटर्न मिलते हैं। 1 के बजाय 4 बाइट्स पढ़ना 4x तेज हो सकता है। लेकिन 4,000, 40,000 या 400,000 पढ़ना चीजों को गति नहीं देगा (वास्तव में, उपर्युक्त कारणों से, बड़े बफर वास्तव में चीजों को धीमा कर सकते हैं)।

  • कुछ मामलों में, भौतिक उपकरण विशिष्ट डेटा आकारों के साथ काम करते हैं (उदाहरण के लिए 4096 बाइट प्रति सेक्टर, 128 बाइट प्रति कैश लाइन, या 1500 बाइट प्रति डेटा पैकेट, या 8 बाइट्स (64 बिट्स) एक सीपीयू बस पर)। अंतर्निहित परिवहन/भंडारण तंत्र से मेल खाने वाले हिस्सों में डेटा को विभाजित करना (या गुणक हैं) हार्डवेयर को डेटा को अधिक कुशलतापूर्वक संसाधित करने में मदद कर सकता है।

आमतौर पर मैं/हे ज्यादातर स्थितियों के लिए सबसे अच्छा 4kB के बीच 128kB को काम के बफ़र्स, और आप धुन विशेष आपरेशन करने के लिए इन किया जा रहा है सकते हैं, तो कोई "सही" आकार कि सभी परिस्थितियों फिट बैठता है।

ध्यान दें कि अधिकांश I/O परिस्थितियों में, कई बफर का उपयोग किया जा रहा है। जैसे डिस्क से डेटा कॉपी करते समय, (सरल शब्दों में) इसे हार्ड ड्राइव में डिस्क से रीड कैश (बफर) में पढ़ा जाता है, फिर इंटरफ़ेस केबल पर कंप्यूटर के ड्राइव नियंत्रक को भेजा जाता है, जो डेटा को बफर भी कर सकता है। फिर इसे एक आई/ओ बफर के माध्यम से रैम में स्थानांतरित किया जा सकता है, जहां तक ​​यह तब तक आयोजित किया जाता है जब तक आपका प्रोग्राम इसे प्राप्त करने के लिए तैयार न हो (यह संभवतः डेटा पूछने से पहले भी आपको लाएगा, क्योंकि यह उम्मीद करता है कि आप इसे पढ़ना जारी रखें एक ही फाइल, और डेटा बफर करने का प्रयास करती है ताकि आपको इसके लिए इंतजार न करना पड़े)। फिर आप इसे अपने बफर में पढ़ते हैं और इसे लिखते हैं। फिर यह एक और I/O बफर पर जाता है, ड्राइव नियंत्रक को भेजा जाता है, ड्राइव पर भेज दिया जाता है, और एक लेखन कैश में कैश किया जाता है। आखिर में हार्ड ड्राइव वास्तव में डेटा को अपने लेखन कैश में संग्रहीत करने का निर्णय लेगा, और आपकी प्रतिलिपि पूरी हो जाएगी - इनमें से अधिकतर पृष्ठभूमि में होती है, इसलिए आपके प्रोग्राम को लगता है कि यह लिखने के बाद कई सेकंड तक लिखा जा सकता है और एक और काम पर चला गया है। (यही कारण है कि आपको उन्हें अनप्लग करने से पहले यूएसबी ड्राइव को "सुरक्षित रूप से हटा देना" है - ओएस ने वास्तव में डिवाइस पर सभी डेटा लिखे नहीं हैं, कंप्यूटर के बाद भी आपके सेकेंड ऑपरेशन समाप्त होने के कई सेकंड बाद)

4

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

मेरा सुझाव यह है कि इन दिनों का हिस्सा वास्तव में केवल इतना ही महत्वपूर्ण है अगर इसका बहुत नमूना (ऑपरेशन ओवरहेड बनाम राशि प्राप्त हुई) या बहुत बड़ी (आईओ सिस्टम अवरोधन और संतृप्ति)।

मैं किसी विशेष मामले आप चाहिए

  1. कम से कम आईओ की संख्या इस रणनीति कॉल
  2. ऑल्टर अगर असली प्रदर्शन एक मुद्दा है के लिए लगता है।
संबंधित मुद्दे