热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在大型数组中搜索信息-Searchingforinfoinlargearrays

Ivegotascriptwhichindexesinformationfromourequipment.Tostoreandanalyzetheinformation

I've got a script which indexes information from our equipment. To store and analyze the information I've created a 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;
}
'@

Then when I run the script I've been planning to go through the object class to translate name to IP with the following function:

然后当我运行脚本时,我一直计划通过以下函数通过对象类将名称转换为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 {
        ""
    }
}

It works, but it's terribly slow as the $CPNetworkObjects contains over 12 000 elements of the type CPObject.

它有效,但它非常慢,因为$ CPNetworkObjects包含超过12 000个CPObject类型的元素。

I want to speed this up. Is there any way to index an array to make the search more efficient or is the only solution to try to lessen the number of objects used?

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

Kind regards, Patrik

亲切的问候,Patrik

3 个解决方案

#1


If any give combination of id plus name is unique, you can speed up a name-to-ip resolution by building a lookup table:

如果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"]

 }

#2


maybe you could use a pscustomobject instead of a class ? searching an array of 15000 simple objects doesnt seem too long :

也许你可以使用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}} 

takes 802ms

#3


Is there any way to index an array to make the search more efficient

有没有办法索引数组,使搜索更有效

First of all, I don't know a thing about powershell so I won't be able to give you code samples.

首先,我不知道有关PowerShell的事情,所以我将无法为您提供代码示例。

If you can change your data structure

If either the id or name is unique, you should try to remove this unique field from your CPObject and use it as the key for your hash map, and have your CPObject as the value returned by the hash table.

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

If you cannot change your data structure

You should try to sort your array using the name and/or the id You can go from O(n) time complexity O(log(n)) when looking for a name to

您应该尝试使用名称和/或ID对数组进行排序您可以在寻找名称时从O(n)时间复杂度O(log(n))开始

Hope this helped,

希望这有帮助,


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了如何使用动态尺寸巧妙地将R中的数组子集化。作者通过解释数组的三个维度以及第三个维度的长度可变性,提出了一种周期性子集化数组的方法,并举例说明了如何创建第二个数组。这个方法对于制作模拟模型非常有用。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  • Python中的PyInputPlus模块原文:https ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
author-avatar
278787061w
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有