Лучший тип для хранения многомерных данных для скорости - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть скрипт, который сравнивает ссылки на базы данных и запускает test-path, чтобы проверить, существует ли он, что-либо, что не добавлено в пользовательский объект.Для старых клиентов количество документов, удаленных из файловой системы, но не из базы данных, огромно.Поэтому я пытаюсь немного ускорить это:

Measure-Command -Expression {
  $count = 10000
  $hashtablelistofitems = @{}
  for ($i=0; $i -le $count; $i++) 
  {
    $hashtablelistofitems.add("$i", "i'm a value")
  }
} | Select-Object -Property TotalMilliSeconds



Measure-Command -Expression {
  $count = 10000

  $array = @()
  $listofitems = "" | select key,value
  for ($x=0; $x -le $count; $x++) 
  {
    $listofitems.key = "$x"
    $listofitems.value = "i'm a value"
    $array += $listofitems
  }
} | Select-Object -Property TotalMilliSeconds



Measure-Command -Expression {
  $count = 10000

  $myitems = @()
  for ($x=0; $x -le $count; $x++) 
  {
    $myitems += @([pscustomobject]@{key=$x.path;ID="i'm a value"})
  }
} | Select-Object -Property TotalMilliSeconds

В настоящее время я использую третий подход, результаты этих команд:

TotalMilliseconds
-----------------
          40.0566
        2609.2074
        3061.0848

Так что вы можетевидите, я использую самый медленный метод, и хеш-таблица намного быстрее, чем пользовательский объект.Моя проблема в том, что у меня проблемы с передачей значений хеш-таблиц в модуль отчетов, например Export-Excel, в аккуратном формате для отправки клиентам.

Существуют ли другие многомерные типы данных, которые я мог бы использовать?или есть способ, которым я могу улучшить скорость пользовательского объекта, который я использую в настоящее время?

Вот код, который я использую для получения данных:

    foreach ($file in $files) {
        if (!(Test-path $file.Path)) {
            $myitems += 
                @([pscustomobject]@{path=$file.path;ID=$file.ID;ObjectID=$file."Object ID";ObjectType=$file."Object Type"})
        }
        Write-Verbose "Processed :: $($file.path)"
    } 

Тогда просто пайпинг $myitems до export-excel

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Существует еще одно решение для ускорения: с помощью System.Collections.ArraLyist.

Я немного изменил ваше третье решение:

Measure-Command -Expression {
  $count = 10000

  $myitems = New-Object System.Collections.ArrayList
  for ($x=0; $x -le $count; $x++) 
  {
    $myitems.add(@([pscustomobject]@{key=$x.path;ID="i'm a value"}))
  }
} | Select-Object -Property TotalMilliSeconds

Запуск всех этих решений на моем компьютерепоказывает следующий результат:

TotalMilliseconds
-----------------
          35.9567
        2148.3292
        2408.9981
         151.4771

Как видите, он действительно быстрее, чем обычный PowerShell ArrayList.

System.Collections.ArraLyist Реализует интерфейс IList с использованием массива, размер которогодинамически увеличивается по мере необходимости.

Источник: https://docs.microsoft.com/en-us/dotnet/api/system.collections.arraylist?view=netframework-4.7.2

0 голосов
/ 03 декабря 2018

Причина, по которой третий подход является медленным, заключается в том, что изменение размера массива является дорогостоящей операцией.В .Net и, следовательно, в Powershell, массив имеет статический размер.Когда добавляется больше элементов, создается новый массив для увеличения размера, и все элементы копируются в него.Это делает большую дополнительную работу в цикле.

Инициализация массива до нужного размера делает цикл проще простого.Например,

Measure-Command -Expression {
  $count = 10000

  # There's a -le, so count+1 is needed to contain all the values
  # Allocate large enough an array
  $myitems = @(0)*($count+1) 

  for ($x=0; $x -le $count; $x++) 
  {
    $myitems[$x] = @([pscustomobject]@{key=$x.path;ID="i'm a value"})
  }
} | Select-Object -Property TotalMilliSeconds
TotalMilliseconds
-----------------
     115,2909

В моей системе исходная версия работала 2623,2247 мс, поэтому речь идет не только о другом компьютере.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...