Powershell 2 和 .NET:针对极大的哈希表进行优化?

2023-12-07

我正在涉足 Powershell,对 .NET 完全陌生。

我正在运行一个以空哈希表开头的 PS 脚本。哈希表将增长到至少 15,000 到 20,000 个条目。哈希表的键是字符串形式的电子邮件地址,值是布尔值。 (我只需要跟踪我是否看到过电子邮件地址。)

到目前为止,我一直在一次增加哈希表的一个条目。我检查以确保键值对尚不存在(PS 在这种情况下会出错),然后添加该对。

这是我们正在讨论的代码部分:

...
    if ($ALL_AD_CONTACTS[$emailString] -ne $true) {
      $ALL_AD_CONTACTS += @{$emailString = $true}
    }
...

我想知道从 PowerShell 或 .NET 的角度来看,如果您提前知道该哈希表会很大,例如 15,000 到 20,000 个条目或更多,是否可以做一些事情来优化该哈希表的性能。

Thanks!


我使用进行了一些基本测试Measure-Command,使用一组 20 000随机词.

各个结果如下所示,但总而言之,通过首先分配一个具有单个条目的新哈希表来添加到一个哈希表的效率非常低:) 尽管选项 2 到 5 之间有一些小的效率提升,但总的来说,它们都执行了差不多。

如果让我选择,我可能会倾向于选项 5,因为它简单(只需一个Add每个字符串调用),但我测试的所有替代方案似乎都是可行的。

$chars = [char[]]('a'[0]..'z'[0])
$words = 1..20KB | foreach {
  $count = Get-Random -Minimum 15 -Maximum 35
  -join (Get-Random $chars -Count $count)
}

# 1) Original, adding to hashtable with "+=".
#     TotalSeconds: ~800
Measure-Command {
  $h = @{}
  $words | foreach { if( $h[$_] -ne $true ) { $h += @{ $_ = $true } } }
}

# 2) Using sharding among sixteen hashtables.
#     TotalSeconds: ~3
Measure-Command {
  [hashtable[]]$hs = 1..16 | foreach { @{} }
  $words | foreach {
    $h = $hs[$_.GetHashCode() % 16]
    if( -not $h.ContainsKey( $_ ) ) { $h.Add( $_, $null ) }
  }
}

# 3) Using ContainsKey and Add on a single hashtable.
#     TotalSeconds: ~3
Measure-Command {
  $h = @{}
  $words | foreach { if( -not $h.ContainsKey( $_ ) ) { $h.Add( $_, $null ) } }
}

# 4) Using ContainsKey and Add on a hashtable constructed with capacity.
#     TotalSeconds: ~3
Measure-Command {
  $h = New-Object Collections.Hashtable( 21KB )
  $words | foreach { if( -not $h.ContainsKey( $_ ) ) { $h.Add( $_, $null ) } }
}

# 5) Using HashSet<string> and Add.
#     TotalSeconds: ~3
Measure-Command {
  $h = New-Object Collections.Generic.HashSet[string]
  $words | foreach { $null = $h.Add( $_ ) }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Powershell 2 和 .NET:针对极大的哈希表进行优化? 的相关文章

随机推荐

  • 在elasticsearch 5中聚合_field_names

    我正在尝试聚合 ES 5 中的字段名称 如中所述不同键上的 Elasticsearch 聚合但那里描述的解决方案不再有效 我的目标是获取所有文档的密钥 映射是默认映射 Data PUT products product 1 param fi
  • 有没有办法暂停气流 DagRun?

    有没有办法暂停 Airflow 中的特定 DagRun 我希望能够对单个 DAG 进行多个同时执行的运行 并且我希望能够在某些点单独暂停这些运行 取消暂停 暂停功能似乎仅在 DAG 级别起作用 并暂停 取消所有 DagRun 针对该 DAG
  • 将 Keras 增强数据保存为 numpy 数组

    使用喀拉斯图像数据生成器 我们可以将增强图像保存为 png 或 jpg for X batch y batch in datagen flow train data train labels batch size batch size sa
  • ES6类构造函数不能像普通函数一样调用的原因是什么?

    ES6 类构造函数不能作为普通函数调用 根据 ES6 aTypeError完成此操作后应提出 我曾经认为类只是原型中的构造函数 函数的语法糖 但这使得它稍微不那么重要 我想知道 这背后的理由是什么 除非我错过了什么 否则它会阻止使用自定义调
  • 使用 Python 将纬度、经度、值 CSV 转换为栅格地图

    如果我有一个包含纬度 经度和值字段的 CSV 数据集 那么使用 python 生成栅格地图的最佳方法是什么 栅格 Z 字段可以是该表中的任何列 L5 L6 L7 L8 L9 L10 L11 L12 L13 L14 LAT LON 3 571
  • 在c#中解析阿拉伯日期

    在我正在编写的应用程序中 我想解析 C 中阿拉伯语的特定日期 例如 日期可能如下所示 但我想要这个输出 30 12 1989 我的问题是如何在 C 中执行此操作以从此字符串中获取 DateTime 对象 谁能告诉我该怎么做 东方阿拉伯数字不
  • 带有字母 A-Z 或其他自定义范围的 jQuery UI Spinner

    有没有办法自定义 jQuery UI 微调器 以便可以使用 A Z 字母 或任何自定义范围 是的 这是可能的 这是一个使用 A Z 的简单示例 改编自提供的时间示例 widget ui alphaspinner ui spinner opt
  • Javascript 中的 RTL 确认和警报

    你能做一个confirm or alert显示其消息 RTL 并右对齐 尝试在消息的开头添加以下内容 u200f u200f 例如 alert u200f u200f message or confirm u200f u200f messa
  • 如何向 PropertySheet 添加夹具?

    我有一个类源自CPropertySheet 我想在对话框的右下角插入一个 夹具 我的对话框已经可以调整大小 我只是无法插入夹具 不知道有没有什么特殊的API可以做到这一点 一种选择是手动绘制它 然后覆盖ON WM NCHITTEST并返回H
  • 如何跟踪递归函数 C++

    include
  • 如何将 MySQL 触发器异常/失败信息存储到表或变量中

    我被困在某个地方 需要你的帮助 Scenario 我有两个数据库 即test db1 and test db2并有users桌子上有他们两个 两个数据库最初都是空的 0 行 Here s users表架构 DROP TABLE IF EXI
  • 从 pandas 数据框创建列表字典

    我正在尝试创建基于 pandas 数据框的列表字典 我需要一个列表字典来传递给我的 Plotly 仪表板 In df head Model Make Ford F 150 Ford Escape Ford Mustang Jeep Gran
  • Facebook iOs sdk iphone:从多个视图控制器调用

    我按照 facebook 开发文档的官方指南从我的 iPhone 应用程序实现 SSO 但所有持有 Facebook 类的成员都在同一个视图控制器中 现在考虑我想登录一个导航控制器的第一个视图控制器 然后从同一导航控制器的第三个视图控制器调
  • 运行应用程序时的 IntelliJ MyClass.class(没有此类文件或目录)

    我正在尝试在 IntelliJ 上运行我的 Android 应用程序 我从现有源创建了一个项目 并且已正确附加 SDK 一切运行正常 但当我尝试运行时 它会记录消息 Error MyClass class No such file or d
  • 找到 C 列的最后一行(然后 A 列和 B 列有不同的行大小)?

    如何找到 C 列最后使用的单元格 示例 Sheet1 Col A 和 Col B 有 1200 行 而 Col C 只有 1 行 ColA ColB ColC 1 1 1 2 2 empty 1200 1200 empty 这是我不成功的测
  • ASP.net 有效渲染元标记

    HTML 隐藏代码 MetaDescription Attributes content ThisBlog MetaDescription 这呈现为 As per 这个答案它不需要有 ID 属性 并以 gt 我怎样才能让它以这种方式渲染 我
  • 数据范围订阅奇怪的行为

    我在玩 swift 的Data在下面的小代码中 var d Data count 10 d 5 3 let d2 d 5 lt 8 print d2 0 令我惊讶的是 这段代码抛出异常print 而下面的代码则不然 var d Data c
  • 无 UI 的 WiX 命令行选项“/quiet”会终止正在运行的进程

    我使用 Wix 为我的应用程序创建了一个没有 UI 的安装包 此处称为 XYZ 如果我在 XYZ exe 运行时双击 MSI 它会通知我某个进程正在锁定文件 我可以选择终止锁定进程 也可以中止安装 这很好 作为用户我可以决定做什么 但是当我
  • JComboBox 上的 JScrollPane

    我制作了一个组合框 但某些元素比我的框的宽度更宽 所以我尝试添加一个水平滚动窗格 而我唯一能看到的是一个内部带有组合框的滚动窗格 当然我做错了什么 这是我没有 jscrolpane 的代码 issuerdocumentJComboBox n
  • Powershell 2 和 .NET:针对极大的哈希表进行优化?

    我正在涉足 Powershell 对 NET 完全陌生 我正在运行一个以空哈希表开头的 PS 脚本 哈希表将增长到至少 15 000 到 20 000 个条目 哈希表的键是字符串形式的电子邮件地址 值是布尔值 我只需要跟踪我是否看到过电子邮