2012-08-17 9 views
15

मेरे एज़ूर रोल कोड में मैं एक 400 मेगाबाइट फ़ाइल डाउनलोड करता हूं जो 10 मेगाबाइट भागों में विभाजित होता है और ब्लॉब स्टोरेज में संग्रहीत होता है। मैं डाउनलोड के लिए CloudBlob.DownloadToStream() का उपयोग करता हूं।किसी फ़ाइल की तुलना में मेमोरीस्ट्रीम को धीमा क्यों लिख रहा है?

मैंने दो विकल्पों की कोशिश की। एक FileStream का उपयोग कर रहा है - मैं एक "लिखने" FileStream बना देता हूं और बिना किसी रिवंडिंग के एक ही स्ट्रीम में एक-एक करके भाग डाउनलोड करता हूं और इसलिए मैं मूल फ़ाइल के साथ समाप्त होता हूं। दूसरा विकल्प MemoryStream ऑब्जेक्ट को मूल फ़ाइल आकार से थोड़ा बड़ा गुजरकर धारा आकार (पुनर्विक्रय से बचने के लिए) और MemoryStream में भाग डाउनलोड करने के द्वारा बना रहा है - इस तरह मैं मूल फ़ाइल डेटा रखने वाले MemoryStream के साथ समाप्त होता हूं।

यहाँ कुछ स्यूडोकोड है:

var writeStream = new StreamOfChoice(params); 
foreach(uri in urisToDownload) { 
    blobContainer.GetBlobReference(uri).DownloadToStream(writeStream); 
} 

अब फर्क सिर्फ इतना है कि यह एक मामले में एक FileStream और अन्य में एक MemoryStream है, सभी बाकी ही है। यह पता चला है कि FileStream के साथ लगभग 20 सेकंड लगते हैं और MemoryStream के साथ लगभग 30 सेकंड - हाँ, FileStream तेज़ हो जाता है। \Memory\Available Bytes प्रदर्शन काउंटर के मुताबिक वर्चुअल मशीन के पास MemoryStream से पहले इस समय उपलब्ध 1 गीगाबाइट मेमोरी उपलब्ध है, इसलिए यह पेजिंग के कारण नहीं है।

फ़ाइल को क्यों लिखना MemoryStream से तेज होना चाहिए?

+4

क्या आप सुनिश्चित हैं कि आपकी मेमोरी स्ट्रीम स्वैपिंग नहीं हो रही है? – Oded

+0

दिलचस्प सवाल, अगर मेमोरीस्ट्रीम पर कोई पेजिंग नहीं चल रही है तो बहुत तेज होना चाहिए। आप किस आवृत्ति का उपयोग कर रहे हैं? और क्या आप कुछ कोड पोस्ट कर सकते हैं (भले ही यह संभवतः कोई फर्क नहीं पड़ता क्योंकि आप केवल स्टोरेज क्लाइंट लाइब्रेरी को कॉल कर रहे हैं)। –

+2

क्या आपके पास 1 जीबी * भौतिक * मेमोरी या 1 जीबी * वर्चुअल * मेमोरी है? – Servy

उत्तर

3

जॉन शायद गेंद पर है। सबसे संभावित विश्लेषण, है

  1. स्मृति वास्तव में डिस्क के लिए हाइपरविजर से बाहर पृष्ठांकित कर रहा है।
  2. हाइपरवाइजर स्वैप फ़ाइल कम गति डिस्क पर है (स्थानीय डिस्क कहें)।
  3. वीएम का फाइल सिस्टम एक तेज उद्यम डिस्क (SAN कहें) पर है।

चाहे स्मृति जल्दी हो या नहीं, आपको वास्तव में स्मृति के ऐसे बड़े ब्लॉक आवंटित नहीं करना चाहिए। यहां LOH vs SOH के बारे में पढ़ा है।

+0

ठीक है, यदि डिस्क शामिल हैं तो एक ही गति (या एक ही डिस्क) थी, हम अभी भी पृष्ठ-फ़ाइल-लिखने के लिए फ़ाइल-लिखने की उम्मीद करेंगे, क्योंकि फ़ाइल-लेखन अनुक्रमिक होगा, जो कि किसी भी कताई-प्लेटर आधारित है डिस्क (चाहे सरल या RAID, लेकिन एसएसडी सहित नहीं) अनुक्रमिक मामले में बेहतर है। पिंगिंग उस समय जितना अधिक होता है, उतना समय तक चोट पहुंचाने की वजह से नहीं होता है, इसलिए पगड़ी मेमोरी ज्यादातर मामलों के लिए फ़ाइल एक्सेस को धड़कता है, लेकिन यह नहीं। –

+0

मैं सहमत नहीं हूं। जिस पेजिंग का मैं जिक्र कर रहा हूं वह ओएस पेजिंग की बजाय हाइपरविजर पेजिंग है। वे एक और एक ही बात नहीं हैं। हाइपरवाइजर स्वैपिंग काफी महंगा है क्योंकि यह नहीं जान सकता कि कौन से पेज पेज़ किए जाने के लिए सबसे उपयुक्त हैं। दूसरा है हाइपरविजर पेजिंग अक्सर बड़े पैमाने पर साझा स्टोरेज की बजाय सर्वर की स्थानीय डिस्क पर रखे बड़े पैमाने पर तैनाती में होता है। –

+0

उनमें से कोई भी दूसरे के साथ असहमत नहीं है। 1: एसएएन स्टोरेज> एचवी पेजिंग। 2: डिस्क-आधारित> डिस्क-आधारित पर यादृच्छिक। वे पूरी तरह से दोनों सच हो सकते हैं। –

1

डीबग मोड (वीएस) में मेमोरीस्ट्रीम का उपयोग करते समय गति बहुत धीमी है, यहां तक ​​कि डेटा की थोड़ी मात्रा के साथ भी। डिबगर संलग्न किए बिना चलना यह फ़ाइलस्ट्रीम की तुलना में तुलनीय या तेज है।

सबसे पहले मैं इससे उलझन में आया और यहां समाप्त हुआ। अब मैं मेमोरीस्ट्रीम के साथ ठीक हूँ।

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

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