gpt4 book ai didi

powershell - 使用 PowerShell(通过 Get-AzureStorageBlobContent)下载 Azure blob 非常慢,但通过 Azure Explorer 等下载速度很快?

转载 作者:行者123 更新时间:2023-12-02 23:46:57 25 4
gpt4 key购买 nike

使用非常基本的代码,只需循环访问我的存储帐户并将所有容器和 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
}
}

最佳答案

我在 Github 上查看了 Get-AzureStorageBlobContent 的源代码,发现了一些有趣的事情,这些事情可能会导致下载 Blob(尤其是较小尺寸的 Blob)缓慢:

第 165 行:

ICloudBlob blob = Channel.GetBlobReferenceFromServer(container, blobName, accessCondition, requestOptions, OperationContext);

此代码的作用是向服务器发出请求以获取 blob 类型。因此,您为每个 blob 向服务器添加一个额外的请求。

第 252 - 262 行:

        try
{
DownloadBlob(blob, filePath);

Channel.FetchBlobAttributes(blob, accessCondition, requestOptions, OperationContext);
}
catch (Exception e)
{
WriteDebugLog(String.Format(Resources.DownloadBlobFailed, blob.Name, blob.Container.Name, filePath, e.Message));
throw;
}

如果您查看上面的代码,它首先会下载 blob DownloadBlob 并尝试获取 blob 属性 Channel.FetchBlobAttributes。我还没有查看 Channel.FetchBlobAttributes 函数的源代码,但我怀疑它正在向服务器发出另一个请求。

因此,要下载单个 blob,本质上代码会向服务器发出 3 个请求,这可能是速度缓慢的原因。可以肯定的是,您可以通过 Fiddler 跟踪您的请求/响应,并查看 cmdlet 与存储交互的具体情况。

关于powershell - 使用 PowerShell(通过 Get-AzureStorageBlobContent)下载 Azure blob 非常慢,但通过 Azure Explorer 等下载速度很快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18195111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com