У меня есть небольшой процесс для загрузки файла .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 вместо имеющегося у меня кода регулярного выражения, но он только немного быстрее и не обеспечивает правильное форматирование, которое нам нужно в любом случае.Мой следующий шаг - разделить файлы на более мелкие части и обрабатывать их параллельно, но это будет значительно более интенсивно использовать процессор, и я хотел бы избежать этого, если это возможно.
Любая помощь в оптимизации этого очень ценится!