azure - 与 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 结束。
我尝试尝试创建BlobUploadOptions
properties InitialTransferSize
,MaximumConcurrency
等,但它似乎只会让情况变得更糟。
v12 的性能似乎不太可能直接比 v11 差,所以我想知道我可能会遗漏什么或误解什么。
谢谢!
解决方案
有时,由于 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);
}
上传文件后的输出。
推荐阅读
- excel - Excel VBA 复制范围(左侧的所有单元格)到嵌入的 Word 文档
- bash - 从脚本变量中提取文件名
- reactjs - 在 HTTPS 而不是 HTTP 中启动反应应用程序
- jquery - 点击甚至不适用于动态生成的元素
- sql-server - 为什么一个特定的 SQL Server 数据库无法将 VARCHAR 转换为 NUMERIC?
- sql-server - 访问连接后创建的新表
- npm - 我无法让 Node.js 安装当前版本(Windows)
- c# - 如何获取 [Authorize] 重定向到登录页面的原始 URL?
- javascript - 单击时更改生成的 div 的样式属性
- java - spring转换器接口如何保证实现的线程安全