【问题标题】:Uploading DataTable to Azure blob storage将 DataTable 上传到 Azure Blob 存储
【发布时间】:2023-03-28 16:46:01
【问题描述】:

我正在尝试将 DataTable 序列化为 XML,然后将其上传到 Azure blob 存储。

下面的代码可以工作,但看起来很笨重且内存不足。有一个更好的方法吗?我特别指的是我将一个内存流转储到一个字节数组,然后从中创建一个新的内存流。

        var container = blobClient.GetContainerReference("container");
        var blockBlob = container.GetBlockBlobReference("blob");

        byte[] blobBytes;
        using (var writeStream = new MemoryStream())
        {
            using (var writer = new StreamWriter(writeStream))
            {
                table.WriteXml(writer, XmlWriteMode.WriteSchema);

            }
            blobBytes = writeStream.ToArray();
        }
        using (var readStream = new MemoryStream(blobBytes))
        {
            blockBlob.UploadFromStream(readStream);
        }

【问题讨论】:

  • 因为它已经是表数据,您是否考虑过上传到存储帐户中的表?还是您的解决方案要求您使用 XML?
  • @MartynC 它不一定是 XML,但它必须在 blob 存储中,并且它必须很容易反序列化回 DataTable

标签: c# .net azure-blob-storage system.data


【解决方案1】:

新答案:

我学到了一种更好的方法,即直接打开一个写入 blob 的流。例如:

        using (var writeStream = blockBlob.OpenWrite())
        {
            using (var writer = new StreamWriter(writeStream))
            {
                table.WriteXml(writer, XmlWriteMode.WriteSchema);

            }
        }

根据我们的开发人员,这不需要将整个表缓冲在内存中,并且可能会遇到更少的数据复制。

原答案:

您可以使用 CloudBlockBlob.UploadFromByteArray 方法,直接上传字节数组,而不是创建第二个流。

方法语法见https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.uploadfrombytearray.aspx

【讨论】:

  • 正是我想要的!现在看来很明显。谢谢!
  • 我喜欢这个。我稍微改变了我的实现。为什么使用 StreamWriter? OpenWrite 返回一个继承自 Stream 的 CloudBlobStream。您可以直接将其传递给 WriteXml,而无需使用额外的嵌套 using 语句。
猜你喜欢
  • 2017-01-22
  • 2019-05-26
  • 1970-01-01
  • 2014-08-23
  • 2021-10-13
  • 2018-12-17
  • 2020-08-01
  • 2017-01-24
  • 2017-08-19
相关资源
最近更新 更多