Performance Powershell合并2列出了性能
我在Powershell中有两个包含大量数据的列表:Performance Powershell合并2列出了性能,performance,list,powershell,join,Performance,List,Powershell,Join,我在Powershell中有两个包含大量数据的列表: $Byods,包含Mac和用户名,包含约5000项 $DHCPLeases包含Mac和IP,约3000件 我想创建一个新的列表,其中包含用户名和IP,其中Byods列表居首,IP从DHCPlies中找到,只包含找到匹配的记录(左连接?) 我创建了一个foreach循环,完成了这项工作。然而,它需要大量的时间来完成(>30分钟)。 我相信这会更快。有人吗 $UserByods = @() foreach ($lease in $DHCPLe
- $Byods,包含Mac和用户名,包含约5000项
- $DHCPLeases包含Mac和IP,约3000件
我相信这会更快。有人吗
$UserByods = @()
foreach ($lease in $DHCPLeases)
{
$MAC = [string]$lease.MAC
$UserByod = @()
$UserByod = $Byods | where {$_.MAC -eq $MAC}
if (($UserByod | measure).count -eq 1) {
$ByodIP = New-Object -TypeName PSObject
$ByodIP | Add-Member -Name 'User' -MemberType Noteproperty -Value $UserByod.Username
$ByodIP | Add-Member -Name 'IP' -MemberType Noteproperty -Value $lease.IP
$UserByods += $ByodIP
}
}
在循环中附加到数组的速度很慢。只需在循环中输出自定义对象,并在变量
$UserByods
中收集循环输出。列表上的线性读取也很慢。最好从$Byods
构建一个哈希表,这样您就可以根据设备的MAC地址查找设备
$tbl = @{}
$Byods | ForEach-Object { $tbl[$_.MAC] = $_ }
$UserByods = foreach ($lease in $DHCPLeases) {
New-Object -TypeName PSObject -Property @{
'User' = $tbl[$lease.MAC].Username
'IP' = $lease.IP
}
}
这里可以做一些改进。首先,不要使用
addmember
来构造对象,这比预先指定属性要慢得多
您还希望避免在集合上使用加法运算符(+=
),因为它会导致调整基础数组的大小,这是一个占用大量内存的操作
最后,为MAC相关性使用哈希表,它将比在所有5000个条目中循环3000次要快得多(这就是…|{…}
基本上所做的):
我没有您的列表,但我想知道我的cmdlet在这方面的性能如何。
命令应该是这样的:
$Byods | LeftJoin $DHCPLeases Mac
我在性能方面做了一些努力,但由于这是一个通用解决方案,它可能无法与这里给出的特定解决方案竞争 首先:将$userbyods+=替换为类似list.add()的内容(首先创建一个新列表)。使用+=在每次迭代时创建数组的副本。第二:你们可以用秒表在两个步骤之间划上一段距离来检查性能,看看哪些步骤需要“很长”的时间才能完成。哇,太谢谢你们了!这将脚本缩短到2秒!
$Byods | LeftJoin $DHCPLeases Mac