gpt4 book ai didi

c# - 批量上传大量图像到Azure Blob存储

转载 作者:太空狗 更新时间:2023-10-29 17:43:44 25 4
gpt4 key购买 nike

我的硬盘上本地存储了大约 110,000 张不同格式(jpg、png 和 gif)和大小 (2-40KB) 的图像。我需要将它们上传到 Azure Blob 存储。在执行此操作时,我需要设置一些元数据和 blob 的 ContentType,但否则它就是直接批量上传。

我目前正在使用以下方法来处理一次上传一张图像(并行超过 5-10 个并发任务)。

static void UploadPhoto(Image pic, string filename, ImageFormat format)
{
//convert image to bytes
using(MemoryStream ms = new MemoryStream())
{
pic.Save(ms, format);
ms.Position = 0;

//create the blob, set metadata and properties
var blob = container.GetBlobReference(filename);
blob.Metadata["Filename"] = filename;
blob.Properties.ContentType = MimeHandler.GetContentType(Path.GetExtension(filename));

//upload!
blob.UploadFromStream(ms);
blob.SetMetadata();
blob.SetProperties();
}
}

我想知道是否可以采用另一种技术来处理上传,使其尽可能快。这个特定项目涉及将大量数据从一个系统导入到另一个系统,并且出于客户原因,需要尽快进行。

最佳答案

好的,这就是我所做的。我修改了在异步链中运行 BeginUploadFromStream()、BeginSetMetadata()、BeginSetProperties(),并行超过 5-10 个线程(ElvisLive 和 Knightpfhor 建议的组合)。这可行,但超过 5 个线程的任何线程都会产生糟糕的性能,每个线程需要 20 秒以上(一次处理包含 10 个图像的页面)才能完成。

因此,总结一下性能差异:

  • 异步:5 个线程,每个线程运行一个异步链,每个线程一次处理 10 个图像(出于统计原因分页):~15.8 秒(每个线程)。
  • 同步:1 个线程,一次 10 张图像(出于统计原因分页):~3.4 秒

好吧,这很有趣。同步上传 blob 的一个实例的性能比另一种方法中每个线程的性能好 5 倍。因此,即使运行 5 个线程的最佳异步平衡,也能获得基本相同的性能

因此,我调整了图像文件导入,将图像分成每个包含 10,000 个图像的文件夹。然后我使用 Process.Start() 为每个文件夹启动 Blob uploader 的实例。我在此批处理中有 170,000 张图像需要处理,因此这意味着有 17 个 uploader 实例。当在我的笔记本电脑上运行所有这些时,所有这些的性能都稳定在每组约 4.3 秒

长话短说,我没有尝试让线程以最佳方式工作,而是为每 10,000 个图像运行一个 Blob uploader 实例,所有图像同时在一台计算机上运行。总体性能提升?

  • 异步尝试:14-16 小时,基于运行一两个小时的平均执行时间。
  • 与 17 个独立实例同步:约 1 小时 5 分钟。

关于c# - 批量上传大量图像到Azure Blob存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7719374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com