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

标签 c# azure azure-blob-storage blobstorage

我的硬盘上本地存储了大约 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/

相关文章:

c# - 只要没有单击任何项​​目,就阻止 ToolStripDropDownButton 关闭

c# - 如何将项目插入带有星标的数据库?

c# - VB.NET : What is static T (C#) in VB. 网络?

azure - 适用于 Azure 功能的 Winnovative html 到 pdf 转换器

azure - 新的 Azure SDK 1.7 和增强的发布是否允许自动将静态文件发布到 Blob 存储?

azure - 用于将文件上传到 Blob 存储的 Windows Azure Web 角色

c# - 以编程方式启用 Windows 服务

node.js - 如何删除Azure NodeJS的blob存储容器

c# - SignalR 与 Azure 进行横向扩展以实现聊天场景

azure - 在 powershell 脚本中加密 Azure 存储帐户 key