1

我有以下代码用于将文件夹从本地存储上传到 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 显然应该更快。这种差异是来自存储模拟器的限制(并且在上线时,Parallel 会更快)还是我可能做错了什么?

4

1 回答 1

4

根据我的经验,存储模拟器不会告诉你任何关于你应该期望(或不期望)从实际 Azure 存储中获得的性能。模拟器通常非常慢。

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

于 2011-10-10T08:25:16.347 回答