Задать вопрос
  • Скрипт powershell использует слишком много памяти. Что я делаю не так?

    @conJOULA Автор вопроса
    Удалось добиться желаемого поведения использовав другой подход (другую фичу), которая называется ForEach-Object -Parallel. Если кто-то случайно забредёт сюда в поисках ответа, можете попробовать следующее:

    $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)
    
    $keys | ForEach-Object -Parallel {
        $synccollectionscope = $using:synccollection
    
        # Здесь на самом деле какая-то функция, которая возвращает строку
        $format = 'Changed data'
    
        # Изменяем одно из полей, напоминаю, по ключам лежат массивы
        $synccollectionscope[$_][3] = $format
    
        # Тут вывод чтобы просто отслеживать выполнение скрипта
        Write-Output "Data was changed"
    
    } -ThrottleLimit $threadslimit
    
    # Вывод самой коллекции в консоль, чтобы убедиться, что значения поменялись
    $synccollection


    Делает то же самое, использует практически нулевое количество памяти, работает быстрее.
    Ответ написан
    1 комментарий