如何通过Azure Blob而不遇到内存问题

时间:2019-06-07 10:39:38

标签: powershell azure-storage-blobs

我正在尝试将Azure存储中Blob的访问层从Cool转换为Archive。 我为此使用了Powershell脚本,但是一旦我进入= 200k文件的某些容器,它就会消耗掉我所有的RAM。

我曾希望在Foreach-obejct{}之后创建一个Get-AzStorageBlob可以使它在之后立即遍历该对象,这样它就不会存储它。

#Account information
$StorageAcc = "StorageAccount-info"
$StorageAccKey = "StorageAccKey-info"
$containername = "container1"

#Create a storage context
$context = New-AzStorageContext -StorageAccountName $StorageAcc -StorageAccountKey $StorageAccKey 

Get-AzStorageBlob -Container $containerName -Context $context | ForEach-Object {$_.ICloudBlob.SetStandardBlobTier("Archive")} 

我希望它可以通过一个包含x个文件的容器运行,而不会由于内存问题而使PC崩溃,时间不是问题。

现在,我可以在90分钟内运行132k,这大约需要400Mb的内存/ RAM。 谢谢!

编辑: 对于任何人来说,可能都需要这样的东西。 它将遍历所有Blob,并检查其是否已被存档,从而节省了大量时间。它还会将ContinuationToken保存在一个文本文件中,这样,如果发生什么事情,您不必重新开始。 记住要编辑文件的路径

$StorageAcc = "StorageAccount-info"
$StorageAccKey = "StorageAccKey-info"
$containername = "container1"
$token = $null
$total = 0
$start = 0

#Create a storage context
$context = New-AzStorageContext -StorageAccountName $StorageAcc -StorageAccountKey $StorageAccKey 
do{

$blobs = Get-AzStorageBlob -Container $containerName -Context $context -MaxCount 10000 -ContinuationToken $token
$Total += $Blobs.Count
    foreach ($blob in $blobs)
    {
        If($blob.ICloudBlob.Properties.StandardBlobTier -eq "cool"){

        $blob.ICloudBlob.SetStandardBlobTier("Archive")
        }

    }

if($Blobs.Length -le 0) { Break;}
    $Token = $Blobs[$blobs.Count -1].ContinuationToken;
    Echo "Total $Total blobs in container $ContainerName"
    add-content C:\Users\Admin\Desktop\Token.txt $Token.NextMarker
        if($start -eq 0)
        {
        $start += 1
        $token.NextMarker = "Token"
        }
}
 While ($Token -ne $Null)
 Echo "Total $Total blobs in container $ContainerName the end"

1 个答案:

答案 0 :(得分:2)

它在文档中得到了提示。您可以在batches中进行处理。对其代码稍作修改,即可正常工作。将最大回报率设置为所需的水平。

$MaxReturn = 10000
$ContainerName = "abc"
$Total = 0
$Token = $Null
do
{
    $Blobs = Get-AzStorageBlob -Container $ContainerName -MaxCount $MaxReturn  -ContinuationToken $Token
    $Total += $Blobs.Count
    if($Blobs.Length -le 0) { Break;}

    foreach($blob in $blobs) {
        $blob.ICloudBlob.SetStandardBlobTier("Archive")
    }


    $Token = $Blobs[$blobs.Count -1].ContinuationToken;
}
While ($Token -ne $Null)
Echo "Total $Total blobs in container $ContainerName archived"