与 v11 相比,使用 v12 将文件上传到 Azure Blob 存储 SDK 的 ASP.NET Core 使用更高的内存

Posted

技术标签:

【中文标题】与 v11 相比,使用 v12 将文件上传到 Azure Blob 存储 SDK 的 ASP.NET Core 使用更高的内存【英文标题】:ASP.NET Core Higher memory use uploading files to Azure Blob Storage SDK using v12 compared to v11 【发布时间】:2021-09-13 01:57:09 【问题描述】:

我正在构建一个带有端点的服务,图像和其他文件将上传到该端点,我需要将文件直接流式传输到 Blob 存储。该服务每秒将处理数百张图像,因此我无法在将图像发送到 Blob 存储之前将其缓冲到内存中。

我在关注here的文章时遇到了这条评论

接下来,使用最新版本 (v12) 的 Azure Blob 存储库和流上传方法。请注意,它并不比 IFormFile 好多少!尽管 BlobStorageClient 是与 blob 存储交互的最新方式,但当我查看此操作的内存快照时,它具有内部缓冲区(至少在撰写本文时),导致它在以这种方式使用时表现不佳.

但是,使用几乎相同的代码和使用 CloudBlockBlob 而不是 BlobClient 的先前库版本,我们可以看到更好的内存性能。相同的文件上传会导致小幅增加(由于资源消耗最终会随着垃圾回收而下降),但不会像上面那样接近 600MB 消耗

我试过了,发现是的,与 v12 相比,v11 的内存使用量要少得多!当我用大约 10MB 的内存文件运行测试时,每次新上传(在初始 POST 之后)都会使内存使用量跃升 40MB,而 v11 仅跃升 20MB

然后我尝试了一个 100MB 的文件。在 v12 上,每个请求几乎立即使用 100MB 的内存,之后慢慢攀升,在我第二次上传后超过 700MB。同时 v11 并没有真正在内存中跳跃,尽管它仍然会在内存中缓慢攀升,并在第二次上传后以大约 430MB 结束。

我尝试尝试创建BlobUploadOptions 属性InitialTransferSizeMaximumConcurrency 等,但它似乎只会让情况变得更糟。

v12 的性能似乎不太可能直接比 v11 差,所以我想知道我可能遗漏了什么或误解了什么。

谢谢!

【问题讨论】:

【参考方案1】:

由于 Azure blob 存储 (v12) 库,有时可能会出现此问题。

尝试分块上传大文件[一种称为文件分块的技术,每次上传时将大文件分成更小的块],而不是上传整个文件。请参考这个link

我尝试在我的实验室制作场景

public void uploadfile() 
         
            string connectionString = "connection string"; 
            string containerName = "fileuploaded"; 
            string blobName = "test"; 
            string filePath = "filepath"; 
           BlobContainerClient container = new BlobContainerClient(connectionString, containerName); 
            container.CreateIfNotExists(); 
            // Get a reference to a blob named "sample-file" in a container named "sample-container" 
            BlobClient blob = container.GetBlobClient(blobName); 
            // Upload local file 
            blob.Upload(filePath); 
          

上传文件后的输出。

【讨论】:

以上是关于与 v11 相比,使用 v12 将文件上传到 Azure Blob 存储 SDK 的 ASP.NET Core 使用更高的内存的主要内容,如果未能解决你的问题,请参考以下文章

Discord.js v12 类型错误突击队

Azure Blob 存储客户端库 v12 设置代理

上传大文件 Azure Blob .net SDK v12 问题

是否可以将 Webpack/VueJS 与 Odoo 框架(v12)集成?

如何使用最新的 Azure SDK .NET API v12 在 Blob 上获取共享访问签名?

如何通过 Apache Beam 将文件上传到 Azure blob 存储?