Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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
将文件上载到Azure BLOB存储-并行。Foreach比Foreach慢_Azure_Azure Storage_Task Parallel Library_Azure Storage Blobs_Parallel.foreach - Fatal编程技术网

将文件上载到Azure BLOB存储-并行。Foreach比Foreach慢

将文件上载到Azure BLOB存储-并行。Foreach比Foreach慢,azure,azure-storage,task-parallel-library,azure-storage-blobs,parallel.foreach,Azure,Azure Storage,Task Parallel Library,Azure Storage Blobs,Parallel.foreach,我有以下代码用于将文件夹表单本地存储上载到blob存储,包括blob名称中的文件夹名称本身(代码基于此处找到的一些方法): publicstaticvoiduploadblobdir(CloudBlobContainer容器,stringdirpath) { string dirName=新Uri(dirPath).Segments.Last(); Parallel.ForEach(enumerateDirectoryRecursive(dirPath)),文件=> { string blobN

我有以下代码用于将文件夹表单本地存储上载到blob存储,包括blob名称中的文件夹名称本身(代码基于此处找到的一些方法):

publicstaticvoiduploadblobdir(CloudBlobContainer容器,stringdirpath)
{
string dirName=新Uri(dirPath).Segments.Last();
Parallel.ForEach(enumerateDirectoryRecursive(dirPath)),文件=>
{
string blobName=Path.Combine(dirName,Path.GetFullPath(file)).Substring(dirPath.Length-dirName.Length);
container.GetBlobReference(blobName).UploadFile(文件);
});
}
以及:

私有静态IEnumerable EnumeratoryDirectoryRecursive(字符串根)
{
foreach(目录中的var文件.GetFiles(根))
生成返回文件;
foreach(目录中的var subdir.GetDirectories(root))
foreach(enumerateDirectoryRecursive(subdir)中的var文件)
生成返回文件;
}
这段代码可以正常工作并按预期上传文件夹,但需要花费大量时间才能完成-上传25个文件需要20秒,每个文件40KB~。因此,我尝试将并行循环替换为常规循环,如下所示:

foreach(enumerateDirectoryRecursive(i_DirPath)中的var文件)
{
string blobName=Path.Combine(dirName,Path.GetFullPath(file)).Substring(i_DirPath.Length-dirName.Length);
container.GetBlobReference(blobName).UploadFile(文件);
}
现在上传立即完成(3秒左右)

还需要注意的是,我正在使用存储模拟器进行开发。

平行的。Forech显然应该更快。这种差异是来自存储模拟器的限制(并且在上线时,并行会更快)还是我可能做错了什么?

根据我的经验,存储模拟器严格地告诉您,对于实际Azure存储的性能,您应该期望(或不期望)什么都没有。模拟器通常非常慢


然后,
Parallel.Foreach
只有在传输恰好是延迟限制而不是I/O限制时才会更快。然后,请注意,
Parallel.Foreach
将只使用您的CPU数量作为默认并行度。对于受延迟限制的进程,您通常应该有更多的线程,通常每个CPU 4到8个线程(YMMV)。

根据我的经验,存储模拟器严格地告诉您,对于实际Azure存储的性能,您应该期望(或不期望)什么都没有。模拟器通常非常慢


然后,
Parallel.Foreach
只有在传输恰好是延迟限制而不是I/O限制时才会更快。然后,请注意,
Parallel.Foreach
将只使用您的CPU数量作为默认并行度。对于延迟绑定的进程,通常应该有更多的线程,通常每个CPU 4到8个线程(YMMV)。

您能否更详细地解释I/O绑定和延迟绑定的含义,以及我的代码属于哪种情况?(提醒一下,我正在从本地存储上传,以防万一)通过使用异步传输,您可以获得最大程度的并行化。@OliverBock您能更具体一点吗?您的意思是使用Parallel.Foreach及其内部调用什么异步api吗?@YaronLevi,在普通for循环中调用CloudBlob.BeginUploadFromStream()。它将负责异步启动和运行上载,并在完成后(从另一个线程)回调您。您能否更详细地解释I/O绑定和延迟绑定的含义,以及我的代码属于哪种情况?(提醒一下,我正在从本地存储上传,以防万一)通过使用异步传输,您可以获得最大程度的并行化。@OliverBock您能更具体一点吗?您的意思是使用Parallel.Foreach及其内部调用什么异步api吗?@YaronLevi,在普通for循环中调用CloudBlob.BeginUploadFromStream()。它将负责异步启动和运行上传,并在完成后(从另一个线程)给您回电话。