Как пройти через BLOB-объекты Azure без проблем с памятью - PullRequest
1 голос
/ 07 июня 2019

Я пытаюсь преобразовать уровень доступа наших больших двоичных объектов в хранилище Azure из Cool в Archive. Я использую скрипт Powershell для этого, но как только я доберусь до некоторых наших контейнеров с файлами = 200k, он высосет всю мою оперативную память.

Я надеялся, что создание 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 количеством файлов без сбоя ПК из-за проблем с памятью, время не является проблемой.

Сейчас я могу запустить thorgh 132k за 90 минут, что занимает около 400 МБ моей памяти / ОЗУ. Спасибо!

EDIT: Для всех, кому может понадобиться что-то подобное. Он проверит все 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 Ответ

2 голосов
/ 07 июня 2019

На это намекают в документации.Вы обрабатываете их в партиях .С некоторыми незначительными изменениями в их коде это должно работать.Установите максимальный возврат на то, что вам нужно.

$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"
...