使用 PS 7.3.4 代码运行良好,没有错误。
问题- 脚本消耗的 RAM 不断增长。如何释放 RAM?如何查看哪些内容消耗了 RAM?任何建议都将不胜感激。
处理 10K 输入批次后的内存结果
第一组 10K 内存结果结束。
收集之前使用的循环内存:1,208,928,432
完整收集后循环使用的内存:512,021,912
第二组10K内存结果结束。
收集前循环使用的内存:1,160,822,952
完整收集后循环使用的内存:929,192,840
第三组10K内存结果结束。
收集前循环使用的内存:2,168,048,568
完整收集后循环使用的内存:1,355,942,720
。 。 。
第 8 组 10K 内存结果结束。
收集前循环使用的内存:12,562,155,960
完整收集后循环使用的内存:11,765,923,128
第 9 组 10K 内存结果结束。
收集之前使用的循环内存:13,170,803,320
完整收集后循环使用的内存:12,166,518,384
[int]$i3 = 1
循环遍历 $allArrays 中的所有 arrayList。$allArrays 中的每个 arrayList 包含 10K 个用户 ID。
做 {
$allArrays[$i3] | ForEach-Object -Parallel {
# Contains code to call Microsoft graph API, get some info and write to file.
# At end of script, write all results to arrayList.
# Write all arrayLists to a file.
# Empty all arrayLists using arrayList.Clear()
# # Code to track variables that keep growing in size INSIDE foreach parallel. Unfortunately the variables information returned does not show any variables exceeding a length of 3000. Even after processing 200K input lines.
$varSize = get-variable -Name *
for ($i=0; $i -lt $varSize.Count; $i++)
{
if($varSize[$i].Value -and ($varSize[$i].Value.ToString().Length -gt 3000)){Write-host -ForegroundColor gray "`n`rDisplaying all variables with a length greater than 50"; Write-host -ForegroundColor gray "Name: $($($varSize[$i]).Name) `tLength: $($varSize[$i].Value.ToString().Length)"}
}
}
# Function called to renew access token.
renewAccessToken
$memBefore = '{0:N0}' -f $([System.GC]::GetTotalMemory($false))
write-host -ForegroundColor Gray "`n`rFor loop memory used BEFORE collection: $memBefore - $(getTimestamp)"
[System.GC]::Collect()
[GC]::Collect()
[GC]::WaitForPendingFinalizers()
$memAfter = '{0:N0}' -f $([System.GC]::GetTotalMemory($true))
write-host -ForegroundColor Gray "For loop memory used AFTER full collection: $memAfter - $(getTimestamp)"
# Code to track variables that keep growing in size OUTSIDE foreach parallel. Unfortunately the variables information returned does not show any variables exceeding a length of 100. Even after processing 200K input lines.
$varSize = get-variable -Name *
for ($i=0; $i -lt $varSize.Count; $i++)
{
if($varSize[$i].Value -and ($varSize[$i].Value.ToString().Length -gt 50)){Write-host -ForegroundColor gray "`n`rDisplaying all variables with a length greater than 50"; Write-host -ForegroundColor gray "Name: $($($varSize[$i]).Name) `tLength: $($varSize[$i].Value.ToString().Length)"}
}
$i3++
} while(($allArrays.Count + 1) -ne $i3)