我编写了一个简单的C#控制台应用程序,以测量顺序并并行下载20个Azure blob文件(每个图像约3mb)的速度。
我给人的印象是并行下载文件的速度会大大提高,但是根据我的经验,它实际上需要更长的时间。这是并行下载的代码:
List<Task> tasks = new List<Task>();
foreach (string blobName in blobNames)
{
Task t = Task.Run(() =>
{
CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
blockBlob.DownloadToFileAsync(blobName, FileMode.Create).Wait();
});
tasks.Add(t);
}
Task.WaitAll(tasks.ToArray());
我是否正在处理此错误,导致不必要的瓶颈或其他原因?还是我从根本上误解了并行的好处?
答案 0 :(得分:6)
IMO,您不应该为下载每个Blob启动新任务,因为这是I / O密集型操作,而不是计算密集型操作。 在实际上一无所获的情况下,使用多个任务会增加管理任务的开销。
将代码更改为:
List<Task> tasks = new List<Task>();
foreach (string blobName in blobNames)
{
CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
tasks.Add(blockBlob.DownloadToFileAsync(blobName, FileMode.Create));
}
Task.WaitAll(tasks.ToArray());
这将启动多个异步I / O请求,并且一旦从Azure Blob存储中下载了所有Blob,您的代码就会继续。 由于我们不分别等待每个下载任务,因此所有下载同时运行。
答案 1 :(得分:1)
我给人的印象是并行下载文件的速度会大大提高,但是根据我的经验,它实际上需要更长的时间。这是并行下载的代码:
IO操作的性能取决于很多因素。
只有在并非所有节点都已达到最大性能时,才可以使用并行化来加速。
例如,如果满足以下条件之一,则您将不会从中受益,并且由于开销,整体性能可能会降低:
专门用于下载: