我有以下代码用于将文件夹本地存储上传到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显然应该更快。这种差异是否来自存储模拟器的限制(当上线时,并行会更快)或者是我可能做错的其他事情?
答案 0 :(得分:4)
根据我的经验,存储模拟器会告诉您严格意义上关于您应该(或不是)从实际Azure存储中获得的性能。模拟器通常非常慢。
如果您的传输恰好是延迟限制而不是I / O限制,那么Parallel.Foreach
只会更快。然后,请注意Parallel.Foreach
仅使用您的CPU数作为默认并行度。对于延迟限制进程,通常应该有更多的线程,通常每个CPU有4到8个线程(YMMV)。