将文件上载到Azure BLOB存储 - Parallel.Foreach比Foreach慢

时间:2011-10-10 08:13:28

标签: azure azure-storage task-parallel-library azure-storage-blobs parallel.foreach

我有以下代码用于将文件夹本地存储上传到blob存储,包括blob名称中的文件夹名称(代码基于此处的一些方法http://blog.smarx.com/posts/pivot-odata-and-windows-azure-visual-netflix-browsing ):

public static void UploadBlobDir(CloudBlobContainer container, string dirPath)
        {
            string dirName = new Uri(dirPath).Segments.Last();

            Parallel.ForEach(enumerateDirectoryRecursive(dirPath), file =>
                {
                    string blobName = Path.Combine(dirName, Path.GetFullPath(file)).Substring(dirPath.Length - dirName.Length);
                    container.GetBlobReference(blobName).UploadFile(file);
                });
        }

和:

private static IEnumerable<string> enumerateDirectoryRecursive(string root)
        {
            foreach (var file in Directory.GetFiles(root))
                yield return file;
            foreach (var subdir in Directory.GetDirectories(root))
                foreach (var file in enumerateDirectoryRecursive(subdir))
                    yield return file;
        }

此代码按预期工作并上传文件夹,但需要花费大量时间才能完成 - 上传 25个文件需要 20秒,每个文件需要40KB。所以我厌倦了用这样的常规循环替换并行循环:

foreach (var file in enumerateDirectoryRecursive(i_DirPath))
            {
                string blobName = Path.Combine(dirName, Path.GetFullPath(file)).Substring(i_DirPath.Length - dirName.Length);
                container.GetBlobReference(blobName).UploadFile(file);
            }

现在上传立即完成( 3秒约。)。

同样重要的是要注意我正在与存储模拟器进行开发。
Parallel.Forech显然应该更快。这种差异是否来自存储模拟器的限制(当上线时,并行会更快)或者是我可能做错的其他事情?

1 个答案:

答案 0 :(得分:4)

根据我的经验,存储模拟器会告诉您严格意义上关于您应该(或不是)从实际Azure存储中获得的性能。模拟器通常非常慢。

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