Память параллельной оперативной памяти PowerShell ForEach-Object продолжает расти

Использование PS 7.3.4 Код работает нормально, без ошибок.

Проблема : объем оперативной памяти, потребляемой сценарием, продолжает расти. Как освободить оперативную память? Как посмотреть, что потребляет оперативную память? Любые предложения будут очень признательны.

Результаты памяти после обработки пакетов входных данных по 10 КБ

Конец 1-й группы результатов памяти 10 КБ.

Для циклической памяти используется коллекция BEFORE: 1208928432.

Для циклической памяти, используемой ПОСЛЕ полного сбора: 512 021 912.

Конец 2-й группы результатов памяти 10 КБ.

Для циклической памяти используется коллекция BEFORE: 1160822952.

Для циклической памяти, используемой ПОСЛЕ полного сбора: 929 192 840.

Конец 3-й группы результатов памяти 10 КБ.

Для циклической памяти используется коллекция BEFORE: 2168048568.

Для циклической памяти, используемой ПОСЛЕ полного сбора: 1 355 942 720.

. . .

Конец 8-й группы результатов памяти по 10 КБ.

Для циклической памяти используется коллекция BEFORE: 12562155960.

Для циклической памяти, используемой ПОСЛЕ полного сбора: 11765923128

Конец 9-й группы результатов памяти по 10 КБ.

Для циклической памяти используется коллекция BEFORE: 13170803 320.

Для циклической памяти, используемой ПОСЛЕ полного сбора: 12 166 518 384.

[целое]$i3 = 1

Прокрутите все списки массивов в $allArrays. Каждый массивList внутри $allArrays содержит 10 тысяч идентификаторов пользователей.

Делать {

      $allArrays[$i3] | ForEach-Object -Parallel {

# Contains code to call Microsoft graph API, get some info and write to file.

# At end of script, write all results to arrayList.
# Write all arrayLists to a file.
# Empty all arrayLists using arrayList.Clear()

# # Code to track variables that keep growing in size INSIDE foreach parallel.  Unfortunately the variables information returned does not show any variables exceeding a length of 3000.  Even after processing 200K input lines.
$varSize = get-variable -Name *
for ($i=0; $i -lt $varSize.Count; $i++)
    {
        if($varSize[$i].Value -and ($varSize[$i].Value.ToString().Length -gt 3000)){Write-host -ForegroundColor gray "`n`rDisplaying all variables with a length greater than 50"; Write-host -ForegroundColor gray "Name: $($($varSize[$i]).Name) `tLength: $($varSize[$i].Value.ToString().Length)"}
    }

}
# Function called to renew access token.
renewAccessToken

$memBefore = '{0:N0}' -f $([System.GC]::GetTotalMemory($false))
write-host -ForegroundColor Gray "`n`rFor loop memory used BEFORE collection: $memBefore - $(getTimestamp)"
[System.GC]::Collect()
[GC]::Collect()
[GC]::WaitForPendingFinalizers()
$memAfter = '{0:N0}' -f $([System.GC]::GetTotalMemory($true))
write-host -ForegroundColor Gray "For loop memory used AFTER full collection: $memAfter - $(getTimestamp)"

# Code to track variables that keep growing in size OUTSIDE foreach parallel.  Unfortunately the variables information returned does not show any variables exceeding a length of 100.  Even after processing 200K input lines.
$varSize = get-variable -Name *
for ($i=0; $i -lt $varSize.Count; $i++)
    {
        if($varSize[$i].Value -and ($varSize[$i].Value.ToString().Length -gt 50)){Write-host -ForegroundColor gray "`n`rDisplaying all variables with a length greater than 50"; Write-host -ForegroundColor gray "Name: $($($varSize[$i]).Name) `tLength: $($varSize[$i].Value.ToString().Length)"}
    }
        
$i3++

} while(($allArrays.Count + 1) -ne $i3) 

0 ответов

Другие вопросы по тегам