考虑以下代码:
var container = new BlobContainerClient(...);
// fileStream is a stream delivering 10 MB of data
await container.UploadBlobAsync("name-of-blob", fileStream);
使用 Fiddler 代理观察 HTTP 请求,我可以看到这以 4 个 HTTP PUT 请求结束(地址是 127.0.0.1,因为我正在使用 Azurite 模拟器进行本地测试):
前两个请求(603 和 607)大小为 4 MB,第三个(613)大小为 2 MB,第四个(614)最终提交所有发送的块。
不是对数据发出 3 个请求(4 MB + 4 MB + 2 MB),是否可以在一个请求中流式传输 10 MB 的数据以节省一些开销?
由于数据以 4 MB 的块发送,这是否意味着 Azure 存储客户端会等到它从 fileStream
获得 4 MB 才开始发送,这意味着 4 MB 的 RAM 用于缓存?我使用 fileStream
的目的是通过直接将 fileStream 传递到 Azure Blob 存储来减少内存使用量。
我使用的是 Azure.Storage.Blobs
版本 12.8.0(我写这篇文章时的最新稳定版本)。
答案 0 :(得分:2)
广告 1) PUT 操作中单个块的最大大小取决于 Azure 存储服务器版本(请参阅 here)。出于测试目的,我刚刚在 Azure 中创建了一个新的存储帐户,并使用 10.5 MB 的视频文件开始了 UploadBlobAsync()
操作,Fiddler 向我展示了这个
一个 10544014 字节的 PUT 操作。请注意 x-ms-version
请求标头,它使客户端能够指定要使用的版本(请参阅 here)。我想您的本地模拟器只是使用旧的 API 版本。
广告 2) 是的,对于较大的文件,UploadBlobAsync()
会将请求分块,从流中读取一组字节,执行 PUT,读取下一组字节,执行 PUT 等等。