在大型数组中搜索信息
Searching for info in large arrays
我有一个脚本可以索引我们设备的信息。为了存储和分析信息,我创建了一个 class:
Add-Type @'
public class CPObject
{
public int id;
public string name;
public string displayname;
public string classname;
public string ip;
public string netmask;
public string ManagementServer;
}
'@
然后,当我 运行 脚本时,我一直计划通过对象 class 来使用以下函数将名称转换为 IP:
Function NameToIP {
Param([int]$id=0, [string]$name="")
$CPObject = $CPNetworkObjects | Where-Object { $_.id -eq $id -and $_.name -eq $name }
If($CPObject.count -eq 1){
$CPObject.ip
} else {
""
}
}
它可以工作,但速度非常慢,因为 $CPNetworkObjects 包含超过 12000 个 CPObject 类型的元素。
我想加快速度。有什么方法可以索引数组以提高搜索效率,或者是尝试减少使用的对象数量的唯一解决方案?
亲切的问候,
帕特里克
也许您可以使用 pscustomobject 而不是 class?
搜索 15000 个简单对象的数组似乎不会太长:
PS>(1..15000) |%{
>>> $res+=new-object pscustomobject -property @{"id"=$_;name=(get-random)}
>>> }
PS> measure-command -expression {$res |?{$_.id -eq 14999 -and $_.name -eq 513658722}}
需要 802 毫秒
Is there any way to index an array to make the search more efficient
首先,我对powershell一无所知,所以无法提供代码示例。
如果你能改变你的数据结构
如果 id 或 name 是唯一的,您应该尝试从您的 CPObject 中删除这个唯一字段并将其用作哈希映射的键,并将您的 CPObject 作为哈希返回的值 table.
如果你不能改变你的数据结构
您应该尝试使用名称 and/or id 对您的数组进行排序
您可以从 O(n) 时间复杂度 O(log(n)) 寻找名称到
希望对您有所帮助,
如果 id 加名称的任何给定组合是唯一的,您可以通过构建查找来加快名称到 ip 的解析速度 table:
$NameToIP = @{}
Foreach ($Object in $Array) { $NameToIP["$($Object.id)_$($Object.Name)"] = $Object.ip }
Function NameToIP {
Param([int]$id=0, [string]$name="")
$NameToIP["$id_$name"]
}
我有一个脚本可以索引我们设备的信息。为了存储和分析信息,我创建了一个 class:
Add-Type @'
public class CPObject
{
public int id;
public string name;
public string displayname;
public string classname;
public string ip;
public string netmask;
public string ManagementServer;
}
'@
然后,当我 运行 脚本时,我一直计划通过对象 class 来使用以下函数将名称转换为 IP:
Function NameToIP {
Param([int]$id=0, [string]$name="")
$CPObject = $CPNetworkObjects | Where-Object { $_.id -eq $id -and $_.name -eq $name }
If($CPObject.count -eq 1){
$CPObject.ip
} else {
""
}
}
它可以工作,但速度非常慢,因为 $CPNetworkObjects 包含超过 12000 个 CPObject 类型的元素。
我想加快速度。有什么方法可以索引数组以提高搜索效率,或者是尝试减少使用的对象数量的唯一解决方案?
亲切的问候, 帕特里克
也许您可以使用 pscustomobject 而不是 class? 搜索 15000 个简单对象的数组似乎不会太长:
PS>(1..15000) |%{
>>> $res+=new-object pscustomobject -property @{"id"=$_;name=(get-random)}
>>> }
PS> measure-command -expression {$res |?{$_.id -eq 14999 -and $_.name -eq 513658722}}
需要 802 毫秒
Is there any way to index an array to make the search more efficient
首先,我对powershell一无所知,所以无法提供代码示例。
如果你能改变你的数据结构
如果 id 或 name 是唯一的,您应该尝试从您的 CPObject 中删除这个唯一字段并将其用作哈希映射的键,并将您的 CPObject 作为哈希返回的值 table.
如果你不能改变你的数据结构
您应该尝试使用名称 and/or id 对您的数组进行排序 您可以从 O(n) 时间复杂度 O(log(n)) 寻找名称到
希望对您有所帮助,
如果 id 加名称的任何给定组合是唯一的,您可以通过构建查找来加快名称到 ip 的解析速度 table:
$NameToIP = @{}
Foreach ($Object in $Array) { $NameToIP["$($Object.id)_$($Object.Name)"] = $Object.ip }
Function NameToIP {
Param([int]$id=0, [string]$name="")
$NameToIP["$id_$name"]
}