在大型数组中搜索信息

时间:2015-05-05 12:54:54

标签: powershell large-data

我有一个脚本可以索引我们设备的信息。要存储和分析我创建的课程信息:

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;
}
'@

然后,当我运行脚本时,我一直计划通过以下函数通过对象类将名称转换为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包含超过12 000个CPObject类型的元素。

我想加快速度。有没有办法索引数组以提高搜索效率,或者是尝试减少使用对象数量的唯一解决方案?

亲切的问候, 帕特里克

3 个答案:

答案 0 :(得分:3)

如果id和name的任何给定组合是唯一的,您可以通过构建查找表来加快名称到IP的分辨率:

$NameToIP = @{}

Foreach ($Object in $Array) { $NameToIP["$($Object.id)_$($Object.Name)"] = $Object.ip }

Function NameToIP {

    Param([int]$id=0, [string]$name="")

    $NameToIP["$id_$name"]

 }

答案 1 :(得分:1)

也许你可以使用pscustomobject而不是类? 搜索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}} 

需要802ms

答案 2 :(得分:0)

  

有没有办法索引数组以提高搜索效率

首先,我对powershell一无所知,所以我无法给你代码样本。

如果您可以更改数据结构

如果id或name是唯一的,则应尝试从CPObject中删除此唯一字段并将其用作哈希映射的键,并将CPObject作为哈希表返回的值。

如果您无法更改数据结构

您应该尝试使用名称和/或ID对数组进行排序 在寻找名称

时,您可以从O(n)时间复杂度O(log(n))开始

希望这有帮助,