【问题标题】:Stream files to Azure Blob Storage?将文件流式传输到 Azure Blob 存储?
【发布时间】:2021-02-20 12:45:10
【问题描述】:

考虑以下代码:

 var container = new BlobContainerClient(...);
 // fileStream is a stream delivering 10 MB of data
 await container.UploadBlobAsync("name-of-blob", fileStream);

使用 Fiddler Proxy 观察 HTTP 请求,我可以看到这以 4 个 HTTP PUT 请求结束(地址是 127.0.0.1,因为我正在使用 Azurite 模拟器进行本地测试):

前两个请求(603 和 607)大小为 4 MB,第三个请求(613)大小为 2 MB,第四个请求(614)最终提交所有发送的块。

  1. 与其对数据发出 3 个请求(4 MB + 4 MB + 2 MB),是否有可能在一个请求中流式传输 10 MB 的数据以节省一些开销?

  2. 由于数据以 4 MB 块发送,这是否意味着 Azure 存储客户端等到它从 fileStream 获得 4 MB 才开始发送,这意味着 4 MB 的 RAM 用于缓存?我使用fileStream 的意图是通过直接将fileStream 传递到Azure Blob Storage 来减少内存使用量。

我使用的是Azure.Storage.Blobs 12.8.0 版(我写这篇文章时的最新稳定版本)。

【问题讨论】:

    标签: c# azure http stream azure-blob-storage


    【解决方案1】:

    广告 1) PUT 操作中单个块的最大大小取决于 Azure 存储服务器版本(请参阅here)。出于测试目的,我刚刚在 Azure 中创建了一个新的存储帐户并使用 10.5 MB 视频文件开始了 UploadBlobAsync() 操作,Fiddler 向我展示了这个

    具有 10544014 字节的单个 PUT 操作。请注意x-ms-version 请求标头,它使客户端能够指定它想要使用的版本(请参阅here)。我想你的本地模拟器只是在使用旧的 API 版本。

    Ad 2) 是的,对于较大的文件,UploadBlobAsync() 会将请求分块,从流中读取一组字节,执行 PUT,读取下一组字节,执行 PUT 等等。

    【讨论】:

    • 非常感谢您的详细回复。在我这边,我在标题上看到了 2020 年左右的版本(忘记了确切的版本)。也许它只是使用 Azurite 模拟器,将暂停进一步的研究,直到我在 Azure 上运行它。关于请求分块(您回复的广告 2),您知道UploadBlobAsync() 使用哪个缓冲区大小吗?
    猜你喜欢
    • 2019-10-14
    • 2013-08-21
    • 2020-01-03
    • 1970-01-01
    • 2019-01-27
    • 2019-12-29
    • 2019-05-26
    • 2013-11-08
    • 2021-01-10
    相关资源
    最近更新 更多