के अंत में लिख रहा है मैं एक ऐसे सिस्टम पर काम कर रहा हूं जिसके लिए उच्च फ़ाइल I/O प्रदर्शन (सी # के साथ) की आवश्यकता है। असल में, मैं फ़ाइल के अंत तक फ़ाइल की शुरुआत से बड़ी फ़ाइलों (~ 100MB) भर रहा हूं। प्रत्येक ~ 5 सेकंड में मैं फ़ाइल में ~ 5 एमबी जोड़ रहा हूं (अनुक्रमिक रूप से फ़ाइल की शुरुआत से), प्रत्येक थोक पर मैं स्ट्रीम को फ्लश कर रहा हूं। प्रत्येक कुछ मिनटों में मुझे एक संरचना को अद्यतन करने की आवश्यकता है जिसे मैं फ़ाइल के अंत में लिखता हूं (कुछ प्रकार का मेटाडाटा)।फ़ाइल
थोक में से प्रत्येक को फ़्लश करते समय मेरे पास कोई प्रदर्शन समस्या नहीं है। हालांकि, फ़ाइल के अंत में मेटाडेटा अपडेट करते समय मुझे वास्तव में कम प्रदर्शन मिलता है। मेरा अनुमान है कि फ़ाइल बनाते समय (जिसे अतिरिक्त तेज़ भी किया जाना चाहिए), फ़ाइल वास्तव में डिस्क पर पूरे 100 एमबी आवंटित नहीं करती है और जब मैं मेटाडेटा को फ्लश करता हूं तो उसे फ़ाइल के अंत तक सभी जगह आवंटित करनी होगी।
दोस्तों/लड़कियां, कोई विचार मैं इस समस्या को कैसे दूर कर सकता हूं?
बहुत बहुत धन्यवाद!
टिप्पणी से:
सामान्य तौर पर बोल रहा है के रूप में इस कोड है, पहले फ़ाइल को खोला जाता है:
m_Stream = new FileStream(filename,
FileMode.CreateNew,
FileAccess.Write,
FileShare.Write, 8192, false);
m_Stream.SetLength(100*1024*1024);
हर कुछ सेकंड मैं लिख रहा हूँ ~ 5MB।
m_Stream.Seek(m_LastPosition, SeekOrigin.Begin);
m_Stream.Write(buffer, 0, buffer.Length);
m_Stream.Flush();
m_LastPosition += buffer.Length; // HH: guessed the +=
m_Stream.Seek(m_MetaDataSize, SeekOrigin.End);
m_Stream.Write(metadata, 0, metadata.Length);
m_Stream.Flush(); // Takes too long on the first time(~1 sec).
कृपया हमें अपना कोड दिखाएं। – SLaks
क्या आपका मतलब है कि आप 100 एमबी आवंटित करते हैं और _then_ स्थिति 0 से शुरू होने वाले 5 एमबी भाग लिखना शुरू करते हैं? तो 20 भाग अधिकतम हैं? –
हाय हेनक, आम तौर पर कोड निम्नानुसार है (मैं अभी भी कोड को प्रारूपित करने के तरीके को समझने की कोशिश कर रहा हूं)।: सबसे पहले फ़ाइल खोला गया है: m_Stream = नया फ़ाइलस्ट्रीम (फ़ाइल नाम, फ़ाइलमोड.क्रेटन्यू, FileAccess.Write, FileShare.Write, 8192, झूठा); m_Stream.SetLength (100 * 1024 * 1024); प्रत्येक कुछ सेकंड जो मैं लिख रहा हूं ~ 5 एमबी। m_Stream.Seek (m_LastPosition, SeekOrigin.Begin); m_Stream.Write (बफर, 0, बफर। लम्बाई); m_Stream.Flush(); m_LastPosition _- बफर। लम्बाई; m_Stream.Seek (m_MetaDataSize, SeekOrigin.End); m_Stream.Write (मेटाडाटा, 0, मेटाडाटा। लम्बाई); m_Stream.Flush(); ==> पहले लिखने पर बहुत लंबा; –