【问题标题】:Azure - Updating an existing xml file in BLOB storageAzure - 更新 BLOB 存储中的现有 xml 文件
【发布时间】:2011-10-04 20:52:10
【问题描述】:

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

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

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

有几点要提:

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

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

  • 关于blob.Delete(),没有它,上传的xml在blob存储中 似乎在它的末尾缺少一些结束标签。我以为 这是由于与旧数据的冲突造成的。我可以是 这里完全错误,但使用删除解决了它(花费一个 更多交易)。

考虑到我提到的参数,我提供的代码是一种好的做法,还是存在一种更有效的方法?

【问题讨论】:

    标签: c# xml azure azure-storage azure-blob-storage


    【解决方案1】:

    我认为基于流的方法的问题在于存储客户端在开始发送数据之前不知道流的时间。这可能会导致内容长度未更新,从而在文件末尾出现丢失数据的外观。

    使用文本格式的 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
    

    【讨论】:

    • 对于那些可能有帮助的人,我需要 blob.UploadText(xDoc.InnerXml.ToString());上传。如果没有 InnerXml,我会得到一行无用的文本。
    【解决方案2】:

    我知道 XDocument 将整个文件加载到内存中,并且在流中工作( XmlWriter 和 XmlReader )可以解决这个问题。

    不确定它会解决太多问题。想想看。当它通过软管飞行时,你如何将koolaid添加到水中。这就是流。最好等到它在容器中。

    除此之外,关注效率(技术问题)而不是编辑(业务问题)的原因是什么?文档的更改是否频繁到足以保证认真审视性能?还是您只是被正常的开发人员倾向于做的超出必要的事情所困扰? (注意:我也经常在这方面感到内疚)

    乍一看,如果没有 Flush() 的概念,Delete 是一个可以接受的选项。我不确定转向异步方法是否可以以更少的开销实现相同的目的。

    【讨论】:

    • 文档确实经常变化。其实很多时候。假设它们可能在一分钟内被多次更改。
    猜你喜欢
    • 2021-07-09
    • 2018-12-17
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 2015-08-22
    • 2015-04-17
    • 1970-01-01
    • 2019-12-25
    相关资源
    最近更新 更多