Windows 10. PowerShell 7.4.4. Имеется следующий простой скрипт, для примера проблемы, которую я пытаюсь понять:
$threadslimit = 8
$collection = @{}
$synccollection = [System.Collections.Hashtable]::Synchronized($collection)
1..1000 | ForEach-Object {
$data = @('some', 'valuable', 'text', 'data')
$synccollection.Add($_, $data)
}
#выводим созданную коллекцию до изменений, просто чтобы можно было сравнить
$synccollection
# Массив ключей для обхода коллекции
$keys = @($synccollection.Keys)
$jobs = @()
foreach ($key in $keys) {
$jobs += Start-ThreadJob -ScriptBlock {
param(
$synccollection,
$key
)
# Здесь на самом деле какая-то функция, которая возвращает строку
$format = 'Changed data'
# Изменяем одно из полей, напоминаю, по ключам лежат массивы
$synccollection[$key][3] = $format
# Тут вывод чтобы просто отслеживать выполнение скрипта
Write-Output "Data was changed"
} -ThrottleLimit $threadslimit -ArgumentList $synccollection, $key
}
foreach ($job in $jobs) {
$results = Receive-Job -Job $job -Wait
Write-Host "Job $($job.Name) - $results"
Remove-Job -Job $job
}
# Вывод самой коллекции в консоль, чтобы убедиться, что значения поменялись
$synccollection
Скрипт вроде работает как надо, но после первого же запуска, память которую занимает процесс pwsh увеличивается в разы:
Вот столько процесс занимал до запуска скрипта:
Часть памяти удается освободить при помощи [System.GC]::Collect(), но даже с ним, процесс все ещё остается сильно раздутым:
Get-Jobs пустой, если закрыть pwsh, память сразу же освобождается. Размер самой коллекции явно не такой большой, чтобы занимать 1+ГБ оперативки. Что я делаю не так, нагуглить/начатгптиить ответ не получилось.