2012-03-28 13 views
5

पर बड़ा डेटा लिखें जब मुझे बड़ी मात्रा में डेटा < 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) -> लिखने की गति हमेशा अच्छा ..... यह अजीब है

+0

ऐसा लगता है कि thread.sleep स्मृति को साफ़ करने और डिस्क पर डंप करने में मदद कर रहा है। क्या आप अपनी एचडी लिखने की गति का बेंचमार्क कर सकते हैं? मुझे लगता है कि शुरुआत में सबकुछ स्मृति में लिखा जाता है, जब तक कि यह पूर्ण नहीं हो जाता है और फिर दोनों विंडोज पेजिंग फ़ाइल लिखी जा रही है (चूंकि आपने मेमोरी को अधिकतम किया है) और आपकी फाइल लेखन जारी रखती है, इसलिए प्रदर्शन कम हो रहा है। लेकिन मैं गलत हो सकता हूं :) – Dementic

+0

किसी भी मौके पर सिस्टम पर चल रहे कुछ एंटी-वायरस सॉफ़्टवेयर हैं जो रैम भरने के बाद प्रदर्शन धीमा कर देते हैं और डेटा डिस्क पर लिखे जाने लगते हैं? –

+0

एचएम, मेरी समझ में'FileOptions.SequentialScan 'का आपके परिदृश्य में बिल्कुल उपयोग नहीं है। डिस्क से लिखने * डिस्क से * यह महत्वपूर्ण होगा। जहां तक ​​मुझे समझा गया, यह केवल एक सरलीकृत कोड स्निपेट है, इसलिए मुझे लगता है कि 'यादृच्छिक .extBytes' केवल वास्तविक डेटा के लिए प्लेसहोल्डर है। वास्तविक डेटा कहां से आता है? असली डेटा एकत्रित कर सकते हैं अपराधी? –

उत्तर

0

क्या यह किसी भी तरह से पिछले पाठ को लिखने और गड़बड़ में आने से पहले लिखने की कोशिश कर रहा है? (असंभव लगता है, लेकिन यह बहुत अजीब बात है कि Thread.Sleep इसे तेज करना चाहिए और यह इसे समझा सकता है)। यदि आप फ़ाइलस्ट्रीम को लॉक करने के लिए उपयोग कथन के अंदर कोड को संशोधित करते हैं तो ऐसा क्या होता है?

using (FileStream fs = File.Create(@"c:\testing\test.bin", fileBufferSize, fileOptions)) 
{ 
    while (fs.Position < fileBufferSize) 
    { 
    lock(fs) // this is the bit I have added to try to speed it up 
    { 
     random.NextBytes(Buffer); 
     fs.Write(Buffer, 0, Buffer.Length); 
    } 
    } 
} 

संपादित करें: मैंने आपके उदाहरण कोड को सही आकार के फ़ाइल को लिखने के लिए आवश्यक लूप को शामिल करने के लिए tweaked किया है।

संयोग से, जब मैं नमूना कोड चलाता हूं तो यह lock कथन के साथ या बिना बहुत तेज़ होता है और नींद को धीरे-धीरे धीमा कर देता है।

संबंधित मुद्दे