使用非常基本的代码循环通过我的存储帐户并将所有容器和 blob 镜像到我的本地磁盘,我发现Get-AsureStorageBlobContent cmdlet 非常慢?无论 blob 大小如何,每个 blob 似乎都需要一两秒的实时时间……当我们有数千个小文件时,这会增加相当大的开销。
相比之下,在同一台机器和网络连接(甚至同时运行)上,Azure Explorer 执行相同的批量复制速度快 10 到 20 倍,而 AzCopy 执行速度实际上快 100 倍(异步),因此显然这不是网络问题。
是否有更有效的方式来使用 Azure 存储 cmdlet,或者它们天生就慢?Get-AzureStorageContainer的帮助提到了一个-ConcurrentTaskCount选项,它暗示了一些异步的能力,但是没有关于如何实现异步的文档,并且鉴于它只对单个项目进行操作,我不确定它是如何做到的?
这是我正在运行的代码:
$localContent = "C:\local_copy"
$storageAccountName = "myblobaccount"
$storageAccountKey = "mykey"
Import-Module Azure
$blob_account = New-AzureStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey -Protocol https
Get-AzureStorageContainer -Context $blob_account | ForEach-Object {
$container = $_.Name
Get-AzureStorageBlob -Container $container -Context $blob_account | ForEach-Object {
$local_path = "$localContent\{0}\{1}" -f$container,$_.Name
$local_dir = Split-Path $local_path
if (!(Test-Path $local_dir)) {
New-Item -Path $local_dir -ItemType directory -Force
}
Get-AzureStorageBlobContent -Context $blob_account -Container $container -Blob $_.Name -Destination $local_path -Force | Out-Null
}
}