Azure - 更新BLOB存储中的现有xml文件

Yar*_*evi 5 c# xml azure azure-storage azure-storage-blobs

我有XML文件存储在BLOB存储中,我试图找出更新它们的最有效方法(和/或添加一些元素).在WebRole中,我想出了这个:

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);                    
      }                               
}
Run Code Online (Sandbox Code Playgroud)

考虑到效率,我正在考虑这些参数:

  1. BLOB 交易.
  2. 带宽.(不确定是否计算,因为代码在数据中心运行)
  3. 实例上的内存消耗.

有些事要提到:

  • 我的xml文件大约是150-200 KB.

  • 我知道XDocument将整个文件加载到内存中,并且在流中工作(XmlWriter和XmlReader)可以解决这个问题.但我认为这将需要使用BlobStream,这可能导致交易效率降低(我认为).

  • 关于blob.Delete(),没有它,blob存储中上传的xml似乎在它的末尾缺少一些结束标记.我认为这是由与旧数据的冲突引起的.我在这里可能完全错了,但使用删除解决了它(虽然花费了另外一笔交易).

我提供的代码是一个很好的实践,或者考虑到我提到的参数可能存在更有效的方法吗?

小智 5

我认为基于流的方法存在的问题是存储客户端在开始发送数据之前不知道流的长度.这可能导致内容长度无法更新,从而导致文件末尾缺少数据.

以文本格式处理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
Run Code Online (Sandbox Code Playgroud)

此外,如果您可以在不首先下载文件的情况下重新创建文件(我们有时可以这样做),那么您只需上传它并使用一个存储事务覆盖旧文件.

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

blob.UploadText(xDoc.ToString()); // transaction 1
Run Code Online (Sandbox Code Playgroud)