Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 批量将大量图像集上载到Azure Blob存储_C#_Azure_Azure Storage Blobs_Blobstorage - Fatal编程技术网

C# 批量将大量图像集上载到Azure Blob存储

C# 批量将大量图像集上载到Azure Blob存储,c#,azure,azure-storage-blobs,blobstorage,C#,Azure,Azure Storage Blobs,Blobstorage,我有大约110000张不同格式(jpg、png和gif)和大小(2-40KB)的图像存储在本地硬盘上。我需要将它们上载到Azure Blob存储。在执行此操作时,我需要设置一些元数据和blob的ContentType,但除此之外,这是一个直接的批量上传 我目前正在使用以下方法一次上传一个图像(并行处理5-10个并发任务) 我想知道是否有另一种技术可以用来处理上传,使其尽可能快。这个特定项目涉及将大量数据从一个系统导入另一个系统,由于客户的原因,需要尽快进行上传。您可以尝试异步上传方法 publi

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

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


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

您可以尝试异步上传方法

public override IAsyncResult BeginUploadFromStream (
Stream source,
AsyncCallback callback,
Object state
)


由于您上传的文件非常小,我认为您编写的代码可能已经达到了您所能达到的效率。根据您的评论,看起来您已经尝试并行运行这些上载,这是我唯一的其他代码建议

我怀疑为了获得最大的吞吐量,需要为硬件、连接和文件大小找到合适的线程数。您可以尝试使用,使找到这种平衡更容易


微软的极限计算集团也有。它主要关注Azure上部署的工作人员角色的吞吐量,但它会让您了解您所能期望的最佳吞吐量。

好的,下面是我所做的。我在异步链中运行BeginUploadFromStream(),然后是BeginSetMetadata(),然后是BeginSetProperties(),并行运行了5-10个线程(结合了ElvisLive和knightpfhor的建议)。这是可行的,但是任何超过5个线程的线程都会有糟糕的性能,每个线程(一次处理10个图像的页面)需要20秒以上的时间才能完成

因此,总结性能差异:

  • 异步:5个线程,每个线程运行一个异步链,每个线程一次处理10个图像(由于统计原因而分页):~15.8秒(每个线程)。
  • 同步:一次1个线程,10个图像(出于统计原因分页):~3.4秒
好的,这很有趣。一个实例同步上传blob的性能比另一种方法中的每个线程好5倍。因此,即使运行5个线程的最佳异步平衡,性能也基本相同

因此,我调整了我的图像文件导入,将图像分离到每个包含10000个图像的文件夹中。然后,我使用Process.Start()为每个文件夹启动blob上载程序的实例。在这一批中,我有170000个图像要处理,这意味着17个上传器实例。在我的笔记本电脑上运行所有这些功能时,所有这些功能的性能都稳定在每套~4.3秒

长话短说,我没有试图让线程以最佳方式工作,而是在一台机器上同时为每10000个图像运行一个blob上传器实例。总体性能提升

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

您肯定应该在多个流中并行上传(即并发发布多个文件),但在您进行任何实验(错误地)证明没有好处之前,请确保您确实增加了以下值:

ServicePoint允许的最大并发连接数 对象默认值为2


默认值为2时,对于任何目标,最多可以有两个未完成的HTTP请求

您可能需要增加ParallelOperationThreadCount,如下所示。我还没有检查最新的SDK,但在1.3中限制为64。未设置此值导致并发操作减少

CloudBlobClient blobStorage = new CloudBlobClient(config.AccountUrl, creds);
// todo: set this in blob extensions
blobStorage.ParallelOperationThreadCount = 64

如果并行方法的上传时间是串行方法的5倍,那么

  • 带宽很差
  • 我的电脑速度很慢
  • 做错事
我的命令行util在并行运行时得到了很大的提升,即使我不使用内存流或任何其他类似的漂亮东西,我只需生成一个文件名字符串数组,然后使用
parallel.ForEach
上传它们


此外,
Properties.ContentType
调用可能会使您的进度落后很多。就我个人而言,我从不使用它们,我想它们根本不重要,除非你想通过直接URL在浏览器中查看它们。

显而易见的答案是找到更快的(上传)连接。您可以临时升级您的连接,或者尝试借用或租用时间(例如,通过cragislist、本地专业团体等)。我有一条50mb的线路。我遇到的问题是UploadFromStream()返回所需的时间,如果我尝试并行运行10多个任务,我会遇到Azure Blob对象的一些非常奇怪的垃圾收集问题。我知道Rackspace让你只需联邦快递一个驱动器到他们那里,他们会免费将其放到云上。微软有类似的服务吗?微软也提供类似的服务;为了优化一个非常大的批量上传,我做了一件事,就是把所有东西都放在VHD上,上传,连接到同一个数据中心的VM上,然后从那里运行上传工具。除了其他优化之外,还有一件事。请尝试一下。它可以工作,但存在一些严重的性能问题。出于某种原因,在并行线程中运行Blob上载会消耗大量CPU,并且在大约5个线程之外运行速度相当缓慢。请参阅我的答案,以了解我最终方法的详细信息。另一个跟进。。。你试过关掉nagle算法吗?我之前完全忘记了:)哇,那样子
CloudBlobClient blobStorage = new CloudBlobClient(config.AccountUrl, creds);
// todo: set this in blob extensions
blobStorage.ParallelOperationThreadCount = 64