2010-05-16 18 views
6

के अंत में लिख रहा है मैं एक ऐसे सिस्टम पर काम कर रहा हूं जिसके लिए उच्च फ़ाइल 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). 
+0

कृपया हमें अपना कोड दिखाएं। – SLaks

+0

क्या आपका मतलब है कि आप 100 एमबी आवंटित करते हैं और _then_ स्थिति 0 से शुरू होने वाले 5 एमबी भाग लिखना शुरू करते हैं? तो 20 भाग अधिकतम हैं? –

+0

हाय हेनक, आम तौर पर कोड निम्नानुसार है (मैं अभी भी कोड को प्रारूपित करने के तरीके को समझने की कोशिश कर रहा हूं)।: सबसे पहले फ़ाइल खोला गया है: 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(); ==> पहले लिखने पर बहुत लंबा; –

उत्तर

2

जैसा कि ऊपर का सुझाव दिया यह भावना नहीं होगा (यदि आप यह सोचते हैं चाहिए फ़ाइल के अंत में मेटा डेटा) है कि पहले लिखें।

कि 2 बातें (एक गैर स्पार्स फ़ाइल कल्पना करते हुए) करना होगा ... 1. पूरी फ़ाइल 2. के लिए कुल स्थान का आवंटन किसी भी निम्नलिखित लिखने के संचालन एक छोटे से तेजी से के रूप में अंतरिक्ष तैयार है और इंतज़ार है या नहीं।

क्या आप इसे असुरक्षित तरीके से नहीं कर सकते? कम से कम एप्लिकेशन अन्य चीजों पर जा सकता है।

0

क्या आपने AppendAllText विधि की कोशिश की है?

+0

त्वरित उत्तरों के लिए बहुत बहुत धन्यवाद। मुझे ये जवाब प्राप्त करने से डर था :-) फ़ाइल के अंत के अलावा मेटाडेटा को किसी अन्य स्थान पर ले जाना समस्याग्रस्त है लेकिन मुझे लगता है कि मेरे पास कोई अन्य विकल्प नहीं है। बहुत बहुत लोग –

+0

आप फ्लश() क्यों कॉल कर रहे हैं? ऐसा करने से आप क्या हासिल करने की उम्मीद करते हैं? – Stewart

0

आपका प्रश्न पूरी तरह से स्पष्ट नहीं है, लेकिन मेरा अनुमान है कि आप एक फाइल बनाते हैं, 5 एमबी लिखते हैं, फिर 100 एमबी की तलाश करते हैं और मेटाडेटा लिखते हैं, फिर 5 एमबी की तलाश करें और एक और 5 एमबी लिखें।

यदि ऐसा है, तो यह एक फाइल सिस्टम समस्या है। जब आप फ़ाइल का विस्तार करते हैं, तो एनटीएफएस को अंतर को कुछ के साथ भरना होता है। जैसा कि आप कहते हैं, फ़ाइल तब तक आवंटित नहीं की जाती जब तक आप इसे लिख नहीं लेते। पहली बार जब आप मेटाडेटा लिखते हैं तो फ़ाइल केवल 5 एमबी लंबी होती है, इसलिए जब आप मेटाडेटा लिखते हैं तो मेटाडेटा एनटीएफएस को 95 एमबी शून्य आवंटित करना और लिखना होता है। परेशानता से मुझे लगता है कि यह भी तुल्यकालिक रूप से करता है, इसलिए आप ओवरलैप्ड आईओ का उपयोग करके भी जीत नहीं पाते हैं।

+0

गलत, एफएस को बीच में कुछ भी लिखना नहीं है। –

+0

क्या आप इसके बारे में निश्चित हैं? एनटीएफएस निश्चित रूप से स्पैस फ़ाइलों का समर्थन करता है, लेकिन यह डिफ़ॉल्ट रूप से उनका उपयोग नहीं करता है और उन्हें सक्षम करने के लिए आपको विशेष ओएस विशेषाधिकारों की आवश्यकता होती है। यह सुझाव देगा कि अप्रयुक्त फ़ाइल की 95 एमबी वास्तव में आवंटित और शून्य करने की आवश्यकता है। – Stewart