2011-10-04 21 views
5

मेरे पास BLOB स्टोरेज में संग्रहीत XML फ़ाइलें हैं, और मैं यह पता लगाने की कोशिश कर रहा हूं कि उन्हें अपडेट करने का सबसे प्रभावी तरीका क्या है (और/या उनमें कुछ तत्व जोड़ें)। एक WebRole में, मैं इस के साथ आया था:Azure - BLOB स्टोरेज में मौजूदा xml फ़ाइल को अपडेट करना

using (MemoryStream ms = new MemoryStream()) 
{      
     var blob = container.GetBlobReference("file.xml"); 
     blob.DownloadToStream(msOriginal); 
     XDocument xDoc= XDocument.Load(ms); 

     // Do some updates/inserts using LINQ to XML. 

     blob.Delete();//Details about this later on. 

     using(MemoryStream msNew = new MemoryStream()) 
     { 
      xDoc.Save(msNew); 
      msNew.Seek(0,SeekOrigin.Begin); 
      blob.UploadFromStream(msNew);      
     }        
} 

मैं इन मानकों दक्षता पर विचार तलाश में हूं:

  1. ब्लॉब लेनदेन
  2. बैंडविड्थ। (सुनिश्चित नहीं है कि यह गिना जाता है, क्योंकि कोड डेटा-सेंटर में चलता है)
  3. मेमोरी उदाहरण पर खपत।

कुछ बातें उल्लेख करने के लिए:

  • मेरे xml फ़ाइलें चारों ओर 150-200 KB कर रहे हैं।

  • मैं तथ्य यह है कि XDocument स्मृति में पूरे फाइल लोड के बारे में पता कर रहा हूँ, और धाराएं (XmlWriter और XmlReader) में काम कर इस का समाधान कर सकता है। लेकिन मुझे लगता है कि इसे ब्लॉबस्ट्रीम के साथ काम करने की आवश्यकता होगी जो कम कुशल लेनदेन-वार (मुझे लगता है) का कारण बन सकता है।

  • ब्लॉब के बारे में डिलीट(), इसके बिना, ब्लॉब स्टोरेज में अपलोड किए गए एक्सएमएल के अंत में कुछ बंद टैग गायब लगते हैं। मुझे लगता है कि यह पुराने डेटा के साथ टकराव के कारण होता है। मैं यहां पूरी तरह से गलत हो सकता हूं, लेकिन हटाए गए डिलीवरी का उपयोग करके इसे हल किया गया है (हालांकि अधिक लेनदेन की लागत)।

क्या मैंने जो कोड प्रदान किया है वह एक अच्छा अभ्यास है या मेरे द्वारा वर्णित पैरामीटर पर विचार करने का एक और अधिक प्रभावी तरीका मौजूद है?

उत्तर

4

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

टेक्स्ट प्रारूप में ब्लॉब की सामग्री के साथ काम करने से मदद मिलेगी। आप ब्लॉब सामग्री को टेक्स्ट के रूप में डाउनलोड कर सकते हैं और फिर टेक्स्ट के रूप में अपलोड कर सकते हैं। ऐसा करने से, आप दोनों को हटाने से बचने में सक्षम होना चाहिए (आपको 1/3 लेनदेन को सहेजना) और सरल कोड होना चाहिए।

var blob = container.GetBlobReference("file.xml"); 
var xml = blob.DownloadText(); // transaction 1 
var xDoc= XDocument.Parse(xml); 

// Do some updates/inserts using LINQ to XML. 

blob.UploadText(xDoc.ToString()); // transaction 2 

ही, यदि आप पहली जगह में इसे डाउनलोड करने के बिना फ़ाइल को पुन: कर सकते हैं (हम यह कभी कभी ऐसा कर सकते हैं), तो आप बस इसे अपलोड करें और एक भंडारण लेन-देन का उपयोग कर पुरानी को ओवरराइट कर सकते हैं।

var blob = container.GetBlobReference("file.xml"); 
var xDoc= new XDocument(/* generate file */); 

blob.UploadText(xDoc.ToString()); // transaction 1 
1

मुझे इस तथ्य से अवगत है कि XDocument पूरी फ़ाइल को स्मृति में लोड करता है, और धाराओं (XmlWriter और XmlReader) में काम कर रहा है इसे हल कर सकता है।

सुनिश्चित नहीं है कि यह बहुत अधिक हल करेगा। इसके बारे में सोचो। नली के माध्यम से उड़ते समय आप पानी में कुलाइड कैसे जोड़ते हैं। यही एक धारा है। एक कंटेनर में होने तक प्रतीक्षा करने के लिए बेहतर है।

इसके बाहर, संपादन (व्यावसायिक समस्या) के बजाय दक्षता (तकनीकी समस्या) पर ध्यान केंद्रित करने का क्या कारण है? दस्तावेजों को अक्सर प्रदर्शन पर गंभीर नजर रखने के लिए पर्याप्त रूप से बदल दिया गया है? या क्या आप जरूरी चीजों से ज्यादा करने के लिए सामान्य डेवलपर प्रवृत्ति का शिकार कर रहे हैं? (नोट: मैं अक्सर इस क्षेत्र में भी दोषी हूं)

फ्लश() की अवधारणा के बिना, हटाएं एक स्वीकार्य विकल्प है, पहली नज़र में। मुझे यकीन नहीं है कि एसिंच विधियों पर जाने से कम ओवरहेड के साथ एक ही अंत की सुविधा मिल सकती है।

+0

दस्तावेज़ अक्सर बदलते हैं। असल में अक्सर। संभावित रूप से उन्हें कई बार बदला जा सकता है, मान लीजिए, एक मिनट। –

+0

प्रदर्शन में सुधार करने के तरीके पर कोई विचार? –

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