सबसे अच्छा समाधान डबल बफ़रिंग के साथ एक async लेखन को लागू करना है।
समय रेखा देखें:
------------------------------------------------>
FF|WWWWWWWW|FF|WWWWWWWW|FF|WWWWWWWW|FF|WWWWWWWW|
बफर भरने के लिए 'एफ' समय का प्रतिनिधित्व करता है, और 'डब्ल्यू' बफर को डिस्क पर लिखने के लिए समय का प्रतिनिधित्व करता है। तो फाइल करने के लिए बफ़र्स लिखने के बीच समय बर्बाद करने में समस्या। हालाँकि, एक अलग थ्रेड पर लेखन को लागू करके, आप अगले बफर को इस तरह तुरंत भरना शुरू कर सकते हैं:
------------------------------------------------> (main thread, fills buffers)
FF|ff______|FF______|ff______|________|
------------------------------------------------> (writer thread)
|WWWWWWWW|wwwwwwww|WWWWWWWW|wwwwwwww|
एफ - 1 बफर
एफ भरना - 2 बफर
डब्ल्यू भरना - डब्ल्यू को फाइल करने के लिए 1 बफर
लिखना - फाइल करने के लिए 2 बफर लिखना
_ - संचालन पूरा होने तक प्रतीक्षा करें
बफर स्वैप के साथ यह दृष्टिकोण बहुत उपयोगी है जब बफर को भरने के लिए अधिक जटिल संगणना की आवश्यकता होती है (इसलिए, अधिक समय)। मैं हमेशा एक CSequentialStreamWriter वर्ग को लागू करता हूं जो अतुल्यकालिक लेखन को अंदर छिपाता है, इसलिए अंत-उपयोगकर्ता के लिए इंटरफ़ेस में केवल फ़ंक्शन लिखें।
और बफ़र आकार डिस्क क्लस्टर आकार का एक से अधिक होना चाहिए। अन्यथा, आप 2 निकटवर्ती डिस्क क्लस्टर में एक एकल बफर लिखकर खराब प्रदर्शन को समाप्त करेंगे।
आखिरी बफर लिखना।
जब आप अंतिम बार लिखें फ़ंक्शन को कॉल करते हैं, तो आपको यह सुनिश्चित करना होगा कि वर्तमान बफर भरा जा रहा है और साथ ही डिस्क पर भी लिखा जाना चाहिए। इस प्रकार CSequentialStreamWriter का एक अलग तरीका होना चाहिए, मान लें कि अंतिम रूप दें (अंतिम बफर फ्लश), जिसे डेटा के अंतिम भाग को डिस्क पर लिखना चाहिए।
गलती संभालना।
जबकि कोड 2 बफ़र भरना शुरू कर देता है, और 1 एक अलग थ्रेड पर लिखा जा रहा है, लेकिन किसी कारण से विफल रहता है, मुख्य थ्रेड को उस विफलता के बारे में पता होना चाहिए।
------------------------------------------------> (main thread, fills buffers)
FF|fX|
------------------------------------------------> (writer thread)
__|X|
मान लें कि CSequentialStreamWriter के इंटरफ़ेस में फ़ंक्शन रिटर्न बूल है या एक अपवाद फेंकता है, इस प्रकार एक अलग थ्रेड पर कोई त्रुटि होती है, आपको उस स्थिति को याद रखना होगा, इसलिए अगली बार जब आप मुख्य थ्रेड पर लिखें या समाप्त करें, तो विधि वापस आ जाएगी। गलत या एक अपवाद फेंक देंगे। और यह वास्तव में मायने नहीं रखता है कि आपने किस बिंदु पर एक बफर भरना बंद कर दिया है, भले ही आपने विफलता के बाद कुछ डेटा आगे लिखा हो - सबसे अधिक संभावना है कि फ़ाइल दूषित और बेकार होगी।