Нужна помощь в принятии решения о переносе скрипта powershell в python или посмотрите, можно ли продолжить рефакторинг скрипта.Скорость вопроса с данными - PullRequest
0 голосов
/ 14 февраля 2019

Краткое описание проблемы

У меня есть скрипт powershell, который делает то, что я хочу.Это работает слишком медленно.Даже после того, как я реорганизовал свой код.Он просматривает 20 000 объектов, выполняет сравнения, и я использую пустой список для создания новых объектов из сравнений.Я сделал все, что я исследовал, чтобы ускорить все.Это сработало.Это все еще не достаточно быстро.

Что делает скрипт: Генерирует отчет Excel

Как работает скрипт:

Собирает данные

  • Собирает 2 набора данных(Set1, Set2)

  • Преобразует данные в Set1, чтобы их можно было сравнить с Set2.Он просто добавляет два свойства каждому объекту в наборе данных.

  • Отсюда наборы данных хранятся в отдельных переменных.(Set1Raw, Set2Raw)

  • Каждый набор данных индивидуально фильтруется и затем сохраняется в отдельных переменных (Set1Filtered, Set2Filtered)

Имеет ли сравнение данныхи создает новый объект из сравнения

  • Создает пустую переменную списка для окончательных результатов
  • Сравнить Set1Filtered с Set2Raw [foreach ($ entry в Set2Raw)

    • Создает переменную, которая сначала убедится, что мы имеем дело с тем же CompName
    • Создает новый объект со свойствами, которые я хочу
    • Одно свойство выполняет оператор логики if
    • Выводит объект в список
  • Сравнить Set2Filtered с Set1Raw (та же логика, но с исправленными переменными

  • , если свойство с именем status равно "«Нет совпадений» пользователь хочет объединить с 1-м и удалить дубликаты

Я произвел рефакторинг своего кода powershell, и создание списка заняло слишком много времени. Я изменил на переменную $.для каждого() на то, что я могу, а также $ variable.where ().Кроме того, я сделал встроенные объекты, которые тоже быстрее.Все это помогло улучшить скорость.Я не мог взять один foreach или заменить его, и мне интересно, что я недостаточно исследовал с моей стороны.Если я не могу рефакторинг этого, я хочу преобразовать часть, которая медленнее, в Python.Я экспортирую vars как csvs и вызываю скрипт python, чтобы сделать все остальное.

GatherDataWithParallelJobs -Set1JobName "GatherSet1Data" -Set2JobName "GatherSet2Data"
$Set1Raw = Receive-Job "GatherSet1Data" -keep 
$Set2Raw = Receive-Job "GatherSet2Data" -keep
$Set1Filtered = $Set1Raw.where({$_.event_id -eq 1 -or $_.event_id -eq 2 -or $_.event_id -eq 3 -or $_.event_id -eq 4 -or $_.event_id -eq 5 -or $_.event_id -eq 6 -or $_.event_id -eq 7 -or $_.event_id -eq 10 -or $_.event_id -eq 14 -or $_.event_id -eq 16})
$Set2Filtered = $Set2Raw.where({$_.event_id -ne 1 -and $_.event_id -ne 11 -and $_.event_id -ne 13 -and $_.WormGroupName -notlike "*Unix*"})


function GenerateReport-Set1FilteredComparedToSet2Raw {

[System.Collections.ArrayList]$list = @()

foreach($entry in $Set2Raw) {
# make sure we are dealing with the SAME CompName
    $SameComp = $Set1Filtered.Where({$_.CompName -eq $entry.CompName}) | Select-Object -Property event_id -first 1 -ExpandProperty event_id 
    $result = [PSCustomObject]@{
        CompName = $entry.CompName
        FilteredTanium_event_id = $SameComp."event_id"
        UnfilteredWORM_event_id = $entry."event_id"
        Status = if($entry."event_id" -eq $SameComp."event_id"){"Match"}elseif(($entry."event_id") -and ($SameComp."event_id") -and $entry."event_id" -ne $SameComp."event_id"){"No Match"}elseif(-Not($entry."event_id") -and ($SameComp."event_id")){"Set2 Only"}elseif(($entry."event_id") -and -not($SameComp."event_id")){"Set1 Only"}else{"No Match"}
    }
    $list += $result
}
$list
}

$set1FComparedToSet2R = GenerateReport-Set1FilteredComparedToSet2Raw  
$set2FComparedToSet1R = GenerateReport-Set2FilteredComparedToSet1Raw

$set1Raw | Export-Excel -Path $Path -WorksheetName "Set1Raw"
$set2Raw | Export-Excel -Path $Path -WorksheetName "Set2Raw"

$set1FComparedToSet2R.where($status -eq "Match")| Export-Excel -Path $Path -WorksheetName "Match"

$set1FComparedToSet2R.where($status -eq "Set1 Only")| Export-Excel -Path $Path -WorksheetName "Set1 Only"

$set1FComparedToSet2R.where($status -eq "No Match")| Export-Excel -Path $Path -WorksheetName "No Match"


$set2FComparedToSet1R.where($staus -eq "No Match")| Export-Excel -Path $Path -WorksheetName "No Math" -Append

DeDuplicate 

Я только включил необходимый код.Это оно.

Ожидания

Мне просто нужно знать, каким образом мне следует это исправить.Исправьте powershell или используйте Python.

Есть ли способ для этого метода foreach идти быстрее?Я знаю, как сделать $ variable.foreach () для увеличения скорости, но как бы я сделал это без переменной?

Будет ли это быстрее в python?Как мне поступить, если я это сделаю?

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