2011-10-04 62 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. BLOB 交易
  2. 帶寬。 (不知道它是否被計算,因爲代碼在數據中心運行)
  3. 內存消耗在實例上。

有些事情要提:

  • 我的XML文件是150-200左右KB。

  • 我知道XDocument加載整個文件到 內存和工作在流(XmlWriter和XmlReader)可以解決這個問題。但我假設這將需要與BlobStream 合作,這可能導致事務處理方式效率較低(我認爲)。

  • 關於blob.Delete(),沒有它,blob存儲中上傳的xml 似乎在其結尾處缺少一些結束標記。我假設 這是由與舊數據的碰撞造成的。我在這裏可能是 完全錯誤,但使用刪除解決它(雖然成本一個 更多的交易)。

我提供的代碼是一種很好的做法,或者考慮到我提到的參數可能存在更有效的方法?

回答

4

我相信基於數據流的方法存在的問題是,存儲客戶端在開始發送數據之前不知道數據流有多長。這可能會導致內容長度不被更新,從而在文件末尾顯示丟失的數據。

以文本格式處理blob的內容將有所幫助。您可以下載blob內容作爲文本,然後作爲文本上傳。這樣做,你應該能夠避免刪除(節省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)可以解決此問題。

不知道它會解決太多。想想看。在通過軟管飛行時,如何將koolaid添加到水中。這是一個流。最好等到它在一個容器中。

除此之外,關注效率(技術問題)而不是編輯(業務問題)的原因是什麼?這些文件是否經常改變,以致需要認真審視表現?或者,你是否正在陷入正常的開發人員傾向於做超過必需的傾向? (注意:我也經常在這方面有罪)

沒有Flush()的概念,刪除是一個可以接受的選項,乍一看。我不確定是否轉向異步方法可能會以較少的開銷促成相同的目標。

+0

這些文件經常改變。其實很經常。可能他們可能會改變很多次,比如說,一分鐘。 –

+0

關於如何提高性能的任何想法? –