Как оптимизировать расширенное преобразование событий в JSON - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть небольшой процесс для загрузки файла .xel, преобразования его в пользовательские объекты с помощью модуля dba-tools, а затем превращения их в однострочный JSON и экспорта в файл, который отправляется туда, куда он идет,Здесь:

    $path = 'C:\temp\big_xe_file.xel'

    #Read in file
    $xes = Read-DbaXEFile -Path $path

    #Output Variable
    $file = ""
    foreach ($xe in $xes) {

        #format date column
        $xe.timestamp = ($xe.timestamp.DateTime).ToString("yyyy-MM-ddThh:mm:ss.ffff")

        # convert to JSON and change escaped unicode characters back
        $xe = (($xe | ConvertTo-Json -compress)) | % {                                                                                           #| % { [System.Text.RegularExpressions.Regex]::Unescape($_) }
                                          [Regex]::Replace($_, 
                                             "\\u(?<Value>[a-zA-Z0-9]{4})", {
                                                 param($m) ([char]([int]::Parse($m.Groups['Value'].Value,
                                                     [System.Globalization.NumberStyles]::HexNumber))).ToString() } )}

        #Write line to file
        Add-Content -Value "$($xe)`n" -Path 'C:\temp\myevents.json' -Encoding utf8 -NoNewline

    }

Это отвечает всем требованиям и делает именно то, что мне нужно.Противное регулярное выражение в середине состоит в том, что когда вы конвертируете в json, он ОБЯЗАТЕЛЬНО избегает всех символов Юникода, и регулярное выражение волшебным образом превращает их всех обратно в символы, которых мы знаем и любим.

Однако все это слишком медленно.Мы производим большое количество файлов .xel, обычно размером 500 МБ, и нам хотелось бы иметь более короткую задержку между записью и вводом следов.Как есть, для последовательной обработки файла таким способом требуется ~ 35 минут.Задержка, скорее всего, вырастет, если мы отстанем, что кажется вероятным при такой скорости.

Я уже немного ускорил это.Я попытался использовать [System.Text.RegularExpressions.Regex] :: Unescape вместо имеющегося у меня кода регулярного выражения, но он только немного быстрее и не обеспечивает правильное форматирование, которое нам нужно в любом случае.Мой следующий шаг - разделить файлы на более мелкие части и обрабатывать их параллельно, но это будет значительно более интенсивно использовать процессор, и я хотел бы избежать этого, если это возможно.

Любая помощь в оптимизации этого очень ценится!

1 Ответ

0 голосов
/ 24 сентября 2019

Оказалось, что была проблема с конфигурацией, и мы смогли отбросить эту ерунду регулярного выражения и оставить escape-символы в JSON.Тем не менее, я также нашел решение для его ускорения на случай, если кто-нибудь когда-нибудь увидит это.Решением было изменить писателя на использование класса .NET вместо метода powershell

$stream = [System.IO.StreamWriter] $outfile

foreach ($xe in $xes) {

    #format date column
    $xe.timestamp = ($xe.timestamp.DateTime).ToString("yyyy-MM-ddThh:mm:ss.ffff")

    $xe | Add-Member -MemberType NoteProperty -Name 'source_host_name' -Value $server_name

    # convert to JSON and change escaped unicode characters back
    $xe = (($xe | ConvertTo-Json -compress)) #| % {                                                                                           #| % { [System.Text.RegularExpressions.Regex]::Unescape($_) }
                                             # [Regex]::Replace($_, 
                                             #    "\\u(?<Value>[a-zA-Z0-9]{4})", {
                                             #        param($m) ([char]([int]::Parse($m.Groups['Value'].Value,
                                             #            [System.Globalization.NumberStyles]::HexNumber))).ToString() } )}

    #Add-Content -Value "$($xe)`n" -Path 'C:\DBA Notes\Traces\Xel.json' -Encoding utf8 -NoNewline



    $stream.WriteLine($xe)



}

$stream.close()

. Это занимает 1/10 времени.Приветствия

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