如何优化扩展事件到 JSON 的转换



我有一个小过程来摄取一个.xel文件,使用dba-tools模块将其转换为自定义对象,然后将它们转换为单行JSON并将它们导出到一个文件,该文件被发送到任何地方。这里:

$path = 'C:tempbig_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:tempmyevents.json' -Encoding utf8 -NoNewline
}

这符合要求,并且完全符合我的需要。中间令人讨厌的正则表达式是因为当您转换为 json 时,它很容易转义所有 unicode 字符,并且正则表达式神奇地将它们全部转回我们熟悉和喜爱的字符。

但是,这一切都有点太慢了。我们大量生成 .xel 文件,通常大小为 500mb,我们希望在写入和摄取跟踪之间有更短的延迟。就目前而言,以这种方式串行处理文件需要 ~35 分钟。如果我们落后,延迟可能会增加,以这种速度似乎可能会增加。

我已经加快了速度。我尝试使用[System.Text.RegularExpressions.Regex]::Unescape代替我拥有的正则表达式代码,但它只是稍微快一点,并且无论如何都没有提供我们需要的正确格式。我的下一步是将文件拆分为更小的部分并并行处理它们,但这会占用更多的 CPU 资源,如果可能的话,我想避免这种情况。

非常感谢任何优化帮助!

事实证明存在配置问题,我们能够放弃正则表达式废话并将转义字符保留在 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 NotesTracesXel.json' -Encoding utf8 -NoNewline

$stream.WriteLine($xe)

}
$stream.close()

它需要 1/10 的时间。干杯

最新更新