编程语言
首页 > 编程语言> > c# – Azure – 更新BLOB存储中的现有xml文件

c# – Azure – 更新BLOB存储中的现有xml文件

作者:互联网

我有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);                    
      }                               
}

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

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

有些事要提到:

>我的xml文件大约是150-200 KB.
>我知道XDocument将整个文件加载到的事实
内存,以及在流中工作(XmlWriter和XmlReader)可以
解决这个问题但我认为这将需要使用BlobStream
这可能导致交易效率降低(我认为).
>关于blob.Delete(),没有它,blob存储中上传的xml
似乎在它的末尾缺少一些结束标签.我以为
这是由与旧数据的冲突引起的.我可以是
这里完全错了,但使用删除解决了它(花费一个
虽然更多交易).

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

解决方法:

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

以文本格式处理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

标签:c,xml,azure,azure-storage-blobs,azure-storage
来源: https://codeday.me/bug/20190518/1127107.html