मेरे एज़ूर रोल कोड में मैं एक 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
से तेज होना चाहिए?
क्या आप सुनिश्चित हैं कि आपकी मेमोरी स्ट्रीम स्वैपिंग नहीं हो रही है? – Oded
दिलचस्प सवाल, अगर मेमोरीस्ट्रीम पर कोई पेजिंग नहीं चल रही है तो बहुत तेज होना चाहिए। आप किस आवृत्ति का उपयोग कर रहे हैं? और क्या आप कुछ कोड पोस्ट कर सकते हैं (भले ही यह संभवतः कोई फर्क नहीं पड़ता क्योंकि आप केवल स्टोरेज क्लाइंट लाइब्रेरी को कॉल कर रहे हैं)। –
क्या आपके पास 1 जीबी * भौतिक * मेमोरी या 1 जीबी * वर्चुअल * मेमोरी है? – Servy