提高 powershell 文件生成的性能
Improve performance in powershell file generation
我编写了一个基本脚本,它从 restful api 获取系统日志,并将其写入 json 文件。它有效,但我看到了巨大的 RAM 问题 - 我认为这是因为脚本正在获取系统日志条目的全部有效负载并将其存储在内存中,然后再将其写入文件。
下面脚本中的 do 循环用于分页 - api 一次仅 returns 一定数量的事件,因此需要对其进行迭代。
这里可以提高性能吗?我想内存中的有效负载是否可以在达到一定大小时写入文件,然后循环播放?或者还有什么可以减少系统资源的方法吗?
感谢您的帮助!
#Name: getLogs.ps1
#Purpose: Script for exporting logs to a json file
#variables
$org = "<api url here>"
$token="<api token here>"
$filePath = "D:\Downloads\logs\test2.json"
#format the date and append 00:00:00
$fromTime = Get-Date -Format s
$fromTime = $fromTime.Substring(0,10) + "00%3A00%3A00Z"
#format the date and append 23:59.59
$toTime = Get-Date -Format s
$toTime = $fromTime.Substring(0,10) + "T23%3A59%3A59Z"
### Set $uri as the API URI for use in the loop
$uri = "$org/api/v1/logs?until=$toTime&limit=20&sortOrder=DESCENDING&q=&since=$fromTimeT00"
### Define $allLogsas empty array
$allLogs = @()
### Use a while loop and get all users from Okta API
DO
{
$webrequest = Invoke-WebRequest -Headers @{"Authorization" = "SSWS $token"} -Method Get -Uri $uri
$link = $webrequest.Headers.Link.Split("<").Split(">")
$uri = $link[3]
$json = $webrequest | ConvertFrom-Json
$allLogs += $json
#slow it down to avoid rate limits
Start-Sleep -m 1001
} while ($webrequest.Headers.Link.EndsWith('rel="next"'))
# get results, switch to json, save
$allLogs | ConvertTo-Json | Out-File $filePath
您可以尝试更改:
$json = $webrequest | ConvertFrom-Json
收件人:
$webrequest | Out-File $filePath -Append
然后完全取消 $alllogs
。
还有一个 post 关于性能和使用 PoSH Invoke-* cmdlet。
正如前面 post 中所述,在 PoSHv6 之前一般来说速度很慢。
请参阅此 post 以了解有关该主题的内容。
Choppy File Download using Powershell on Azure VM
我编写了一个基本脚本,它从 restful api 获取系统日志,并将其写入 json 文件。它有效,但我看到了巨大的 RAM 问题 - 我认为这是因为脚本正在获取系统日志条目的全部有效负载并将其存储在内存中,然后再将其写入文件。
下面脚本中的 do 循环用于分页 - api 一次仅 returns 一定数量的事件,因此需要对其进行迭代。
这里可以提高性能吗?我想内存中的有效负载是否可以在达到一定大小时写入文件,然后循环播放?或者还有什么可以减少系统资源的方法吗?
感谢您的帮助!
#Name: getLogs.ps1
#Purpose: Script for exporting logs to a json file
#variables
$org = "<api url here>"
$token="<api token here>"
$filePath = "D:\Downloads\logs\test2.json"
#format the date and append 00:00:00
$fromTime = Get-Date -Format s
$fromTime = $fromTime.Substring(0,10) + "00%3A00%3A00Z"
#format the date and append 23:59.59
$toTime = Get-Date -Format s
$toTime = $fromTime.Substring(0,10) + "T23%3A59%3A59Z"
### Set $uri as the API URI for use in the loop
$uri = "$org/api/v1/logs?until=$toTime&limit=20&sortOrder=DESCENDING&q=&since=$fromTimeT00"
### Define $allLogsas empty array
$allLogs = @()
### Use a while loop and get all users from Okta API
DO
{
$webrequest = Invoke-WebRequest -Headers @{"Authorization" = "SSWS $token"} -Method Get -Uri $uri
$link = $webrequest.Headers.Link.Split("<").Split(">")
$uri = $link[3]
$json = $webrequest | ConvertFrom-Json
$allLogs += $json
#slow it down to avoid rate limits
Start-Sleep -m 1001
} while ($webrequest.Headers.Link.EndsWith('rel="next"'))
# get results, switch to json, save
$allLogs | ConvertTo-Json | Out-File $filePath
您可以尝试更改:
$json = $webrequest | ConvertFrom-Json
收件人:
$webrequest | Out-File $filePath -Append
然后完全取消 $alllogs
。
还有一个 post 关于性能和使用 PoSH Invoke-* cmdlet。 正如前面 post 中所述,在 PoSHv6 之前一般来说速度很慢。 请参阅此 post 以了解有关该主题的内容。 Choppy File Download using Powershell on Azure VM