पर बड़ा डेटा लिखें जब मुझे बड़ी मात्रा में डेटा < 2GB फ़ाइल में लिखने में कोई समस्या है। कोड के मुकाबले पहले ~ 1.4 जीबी डेटा तेजी से (100 एमबी/एस) लिखा जाता है (0-2 एमबी/एस)।फ़ाइल कैशिंग समस्या
मेरे कोड (सरलीकृत) है:
//FileOptions FILE_FLAG_NO_BUFFERING = (FileOptions)0x20000000;
FileOptions fileOptions = FileOptions.SequentialScan;
int fileBufferSize = 1024 * 1024;
byte[] Buffer = new byte[32768];
Random random = new Random();
long fileSize = 2588490188;
long totalByteWritten = 0;
using (FileStream fs = File.Create(@"c:\test\test.bin", fileBufferSize, fileOptions))
{
while (totalByteWritten < fileSize)
{
random.NextBytes(Buffer);
fs.Write(Buffer, 0, Buffer.Length);
totalByteWritten += Buffer.Length;
//Thread.Sleep(10);
}
}
मैं वहाँ लगता है के दौरान "तेजी से लिखने प्रदर्शन" रैम वृद्धि के रूप में अच्छी तरह से, जब RAM उपयोग बंद वहाँ बढ़ाने के लिए इस्तेमाल वास्तव में कैशिंग समस्या से संबंधित, एक मुद्दा है प्रदर्शन में एक बूंद है।
मैं क्या कोशिश की है:
परिवर्तन async लिखने को -> कोई काफी
बदल परिवर्तन सरणी बफर आकार -> कोई काफी बदल
परिवर्तन
fileBufferSize
- > कोई महत्वपूर्ण रूप से परिवर्तन नहीं होता है, लेकिन एक बड़े बफर ~ 100 एमबी के साथ, प्रदर्शन लिखना तेज़ होता है और जब राम उपयोग बढ़ने से रोकता है, तो पी लिखें erformance 0 में जाता है और की तुलना में, कुछ समय के बाद, पीठ 100 एमबी करने के लिए चला जाता है, यह seams कि कैश बफर "प्लावित"परिवर्तन
fileOption
कोWriteThrough
है -> प्रदर्शन हमेशा धीमी कर रहे हैं ..के बाद जोड़ने xx लूप
fs.Flush(true)
-> कोई काफी बदलटिप्पणी हटाएं
Thread.Sleep(10)
-> लिखने की गति हमेशा अच्छा ..... यह अजीब है
ऐसा लगता है कि thread.sleep स्मृति को साफ़ करने और डिस्क पर डंप करने में मदद कर रहा है। क्या आप अपनी एचडी लिखने की गति का बेंचमार्क कर सकते हैं? मुझे लगता है कि शुरुआत में सबकुछ स्मृति में लिखा जाता है, जब तक कि यह पूर्ण नहीं हो जाता है और फिर दोनों विंडोज पेजिंग फ़ाइल लिखी जा रही है (चूंकि आपने मेमोरी को अधिकतम किया है) और आपकी फाइल लेखन जारी रखती है, इसलिए प्रदर्शन कम हो रहा है। लेकिन मैं गलत हो सकता हूं :) – Dementic
किसी भी मौके पर सिस्टम पर चल रहे कुछ एंटी-वायरस सॉफ़्टवेयर हैं जो रैम भरने के बाद प्रदर्शन धीमा कर देते हैं और डेटा डिस्क पर लिखे जाने लगते हैं? –
एचएम, मेरी समझ में'FileOptions.SequentialScan 'का आपके परिदृश्य में बिल्कुल उपयोग नहीं है। डिस्क से लिखने * डिस्क से * यह महत्वपूर्ण होगा। जहां तक मुझे समझा गया, यह केवल एक सरलीकृत कोड स्निपेट है, इसलिए मुझे लगता है कि 'यादृच्छिक .extBytes' केवल वास्तविक डेटा के लिए प्लेसहोल्डर है। वास्तविक डेटा कहां से आता है? असली डेटा एकत्रित कर सकते हैं अपराधी? –