【发布时间】:2011-10-10 17:13:54
【问题描述】:
我有以下代码用于将文件夹形式本地存储上传到 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;
}
此代码可以正常工作并按预期上传文件夹,但需要花费大量时间才能完成 - 需要 20 秒上传 25 个文件,每个文件 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 秒 大约)。
还需要注意的是,我正在使用 storage emulator 进行开发。
Parallel.Forech 显然应该更快。这种差异是来自存储模拟器的限制(上线时,Parallel 会更快)还是我可能做错了什么?
【问题讨论】:
标签: azure azure-storage task-parallel-library azure-blob-storage parallel.foreach