ストレージ アカウントを単純にループし、すべてのコンテナーと BLOB をローカル ディスクにミラーリングする非常に基本的なコードを使用すると、Get-AsureStorageBlobContentコマンドレットが非常に遅いことがわかります。BLOB のサイズに関係なく、BLOB ごとにリアルタイムで 1 ~ 2 秒かかるようです。これは、何千もの小さなファイルがある場合にかなりのオーバーヘッドを追加します。
対照的に、同じマシンとネットワーク接続 (同時に実行している場合でも) では、Azure Explorer は同じ一括コピーを 10 倍から 20 倍高速に実行し、AzCopy は文字通り 100 倍高速 (非同期) に実行するため、ネットワークの問題ではないことは明らかです。
Azure Storage コマンドレットを使用するより効率的な方法はありますか?それとも、単に動作が遅いだけですか? 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
}
}