首页 > 解决方案 > 与 v11 相比,使用 v12 将文件上传到 Azure Blob Storage SDK 的 ASP.NET Core 使用更高的内存

问题描述

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

我在这里关注这篇文章并遇到了这个评论

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

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

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

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

我尝试尝试创建BlobUploadOptionsproperties InitialTransferSize,MaximumConcurrency等,但它似乎只会让情况变得更糟。

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

谢谢!

标签: azureasp.net-core.net-5azure-blob-storage

解决方案


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

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

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

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

上传文件后的输出。

在此处输入图像描述


推荐阅读