在 ArrayList 中搜索对象的最优化方法
Most optimized way to search for an Object in an ArrayList
我有一个 IP 列表(列表“X”),我正试图为其查找域名。
我还有一个 Excel 文件,其中包含 170 000 多个具有相应域名的 IP 条目。
所以我首先导入 Excel 文件:
$dnsEntries = Import-Excel -Path '.\file.xlsx' -WorksheetName "list"
然后对于列表“X”中的每个 IP,我尝试在 $dnsEntries
中找到它,这样我就可以获得域名:
foreach($IP in $IPs) {
$DN=($dnsEntries.Where({$_."Address" -like $IP})).Name
}
不幸的是,每个IP至少需要2秒,而我有5000+,所以这需要很长时间。困扰我的是 Excel 可以用一个简单的公式在不到 3 秒的时间内找到所有 5000+ 对应的域名。我知道我永远无法与 PowerShell 如此接近,但差异怎么会这么大?
有什么方法可以加快搜索速度吗?
提前致谢!
编辑:这是一个可重现的例子。某些 IP 将无法匹配。
$IPs = @("10.10.10.1","10.10.10.5","10.10.10.66","10.10.10.99","10.10.10.235","10.10.10.73","10.10.10.98","10.10.10.56")
$dnsEntries = @(
@{Address="10.10.10.73";Name="ip1.local"},
@{Address="10.10.10.98";Name="ip2.local"},
@{Address="10.10.10.1";Name="ip3.local"},
@{Address="10.10.10.56";Name="ip4.local"},
@{Address="10.10.10.235";Name="ip5.local"},
@{Address="10.10.10.5";Name="ip6.local"},
@{Address="10.10.10.11";Name="ip7.local"},
@{Address="10.10.10.81";Name="ip8.local"},
@{Address="10.10.10.2";Name="ip9.local"}
)
foreach($IP in $IPs) {
$DN=($dnsEntries.Where({$_."Address" -like $IP})).Name
Write-Host $DN
}
如其中一条评论所述,我使用以下代码将 $dnsEntries
从 ArrayList 转换为 Hashtable:
$import = Import-Excel -Path '.\file.xlsx' -WorksheetName "list"
$dnsEntries = @{}
foreach($entry in $import){
$dnsEntries.Add($entry.Address,$entry.Name)
}
foreach($IP in $IPs) {
$DN=$dnsEntries[$IP]
Write-Host $DN
}
转换还是需要很长时间,但是找域名换IP几乎是瞬间!所以最终还是节省了很多时间。
感谢大家的建议!
我有一个 IP 列表(列表“X”),我正试图为其查找域名。 我还有一个 Excel 文件,其中包含 170 000 多个具有相应域名的 IP 条目。
所以我首先导入 Excel 文件:
$dnsEntries = Import-Excel -Path '.\file.xlsx' -WorksheetName "list"
然后对于列表“X”中的每个 IP,我尝试在 $dnsEntries
中找到它,这样我就可以获得域名:
foreach($IP in $IPs) {
$DN=($dnsEntries.Where({$_."Address" -like $IP})).Name
}
不幸的是,每个IP至少需要2秒,而我有5000+,所以这需要很长时间。困扰我的是 Excel 可以用一个简单的公式在不到 3 秒的时间内找到所有 5000+ 对应的域名。我知道我永远无法与 PowerShell 如此接近,但差异怎么会这么大?
有什么方法可以加快搜索速度吗?
提前致谢!
编辑:这是一个可重现的例子。某些 IP 将无法匹配。
$IPs = @("10.10.10.1","10.10.10.5","10.10.10.66","10.10.10.99","10.10.10.235","10.10.10.73","10.10.10.98","10.10.10.56")
$dnsEntries = @(
@{Address="10.10.10.73";Name="ip1.local"},
@{Address="10.10.10.98";Name="ip2.local"},
@{Address="10.10.10.1";Name="ip3.local"},
@{Address="10.10.10.56";Name="ip4.local"},
@{Address="10.10.10.235";Name="ip5.local"},
@{Address="10.10.10.5";Name="ip6.local"},
@{Address="10.10.10.11";Name="ip7.local"},
@{Address="10.10.10.81";Name="ip8.local"},
@{Address="10.10.10.2";Name="ip9.local"}
)
foreach($IP in $IPs) {
$DN=($dnsEntries.Where({$_."Address" -like $IP})).Name
Write-Host $DN
}
如其中一条评论所述,我使用以下代码将 $dnsEntries
从 ArrayList 转换为 Hashtable:
$import = Import-Excel -Path '.\file.xlsx' -WorksheetName "list"
$dnsEntries = @{}
foreach($entry in $import){
$dnsEntries.Add($entry.Address,$entry.Name)
}
foreach($IP in $IPs) {
$DN=$dnsEntries[$IP]
Write-Host $DN
}
转换还是需要很长时间,但是找域名换IP几乎是瞬间!所以最终还是节省了很多时间。
感谢大家的建议!