需要使 PowerShell 脚本更快

2024-04-22

我自学了 Powershell,所以我不知道它的一切。

我需要搜索一个数据库,其中包含我输入的确切行数(数据库是预定义的),它包含 > 11800 个条目。

您能帮我找出是什么原因导致速度变慢吗?

Code:

$Dict = Get-Content "C:\Users\----\Desktop\Powershell Program\US.txt"

if($Right -ne "") {
    $Comb = $Letter + $Right
    $total = [int]0    
    $F = ""

    do {
        $F = $Dict | Select-Object -Index $total
        if($F.Length -eq $Num) {
            if($F.Chars("0") + $F.Chars("1") -eq $Comb) {
                Add-Content "C:\Users\----\Desktop\Powershell Program\Results.txt" "$F"
            }
        }
        $total++
        Write-Host $total
    } until([int]$total -gt [int]118619)

    $total = [int]0
    $F = ""
}

如何加快逐行搜索/匹配过程?我是通过多线程来做的吗?如果是这样怎么办?


看起来您在使用 powershell 之前至少已经了解一种其他语言,并且基本上是从在这一种语言中复制您可能在另一种语言中所做的事情开始的。这是学习新语言的好方法,但当然,一开始您可能会得到有点奇怪或性能不佳的方法。

首先我想分解一下你的代码实际上在做什么,作为一个粗略的概述:

  1. 一次读取文件的每一行并将其存储在$Dict多变的。
  2. 循环次数与行数相同。
  3. In each iteration of the loop:
    1. 获取与循环迭代匹配的单行(本质上是通过另一次迭代,而不是索引,稍后会详细介绍)。
    2. 获取该行的第一个字符,然后获取第二个字符,然后将它们组合起来。
    3. 如果它等于预先确定的字符串,则将此行附加到文本文件中。

步骤 3-1 才是真正减慢速度的原因

要了解原因,您需要了解一些有关 PowerShell 中的管道的知识。接受并在管道上工作的 Cmdlet 接受一个或多个对象,但它们一次处理一个对象。他们甚至无权访问管道的其余部分。

对于Select-Objectcmdlet。因此,当您获取一个包含 18,500 个对象的数组并将其通过管道传输到Select-Object -Index 18000,您需要发送 17,999 件物品进行检查/处理,然后它才能给您您想要的物品。您可以看到索引越大,所花费的时间就会变得越来越长。

由于您已经有一个数组,因此您可以通过带方括号的索引直接访问任何数组成员[]像这样:

$Dict[18000]

对于给定的数组,无论索引是什么,都需要相同的时间。

现在只需一次调用Select-Object -Index即使索引非常大,您也可能不会注意到它需要多长时间;问题是你已经循环遍历了整个数组,所以这会大大加剧。

You're essentially having to do the sum of 1..18000 which is about or approximately 162,000,000 iterations! (thanks to user2460798 https://stackoverflow.com/users/2460798/user2460798 for correcting my math)

Proof

我测试了这个。首先,我创建了一个包含 19,000 个对象的数组:

$a = 1..19000 | %{"zzzz~$_"}

然后我测量了两种访问它的方法。首先,与select -index:

measure-command { 1..19000 | % { $a | select -Index ($_-1 ) } | out-null }

Result:

TotalMinutes      : 20.4383861316667
TotalMilliseconds : 1226303.1679

然后使用索引运算符 ([]):

measure-command { 1..19000 | % { $a[$_-1] } | out-null }

Result:

TotalMinutes      : 0.00788774666666667
TotalMilliseconds : 473.2648

结果非常惊人,需要长了近 2,600 倍 to use Select-Object.

一个计数循环

以上是导致您的速度大幅下降的唯一原因,但我想指出其他一些事情。

通常在大多数语言中,您会使用for循环计数。在 PowerShell 中,这看起来像这样:

for ($i = 0; $i -lt $total ; $i++) {
    # $i has the value of the iteration
}

简而言之,里面有3个说法for环形。第一个是在循环开始之前运行的表达式。$i = 0将迭代器初始化为0,这是第一个语句的典型用法。

接下来是条件句;这将在每次迭代中进行测试,如果返回 true,循环将继续。这里$i -lt $total比较检查以查看$i小于 的值$total,其他地方定义的其他变量,大概是最大值。

最后一条语句在循环的每次迭代中执行。$i++是相同的$i = $i + 1所以在这种情况下我们要增加$i在每次迭代中。

它比使用 a 更简洁一些do/until循环,并且更容易理解,因为 a 的含义for循环是众所周知的。

其他注意事项

如果您有兴趣了解更多反馈working你写的代码,看看代码审查 https://codereview.stackexchange.com/。发帖前请仔细阅读那里的规则。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

需要使 PowerShell 脚本更快 的相关文章

随机推荐

  • 将 SSL 连接到子域 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我已为我的主域分配了 SSL 我想知道是否可以将 SSL 用于我的子域 我坦白地尝试了一下 但它显示警告页面 说该页面不安全等等 有没有解决方案 以便
  • 如何使用故事板通过自定义图像设置 iPhone 选项卡栏图标

    我是 iphone 开发的新手 我需要在标签栏中放置一个自定义图像图标 但它只显示默认颜色 黑色和蓝色 帮助我克服这个错误朋友 在应用程序中添加图像 并参见附图
  • 如何在hadoop/map reduce中创建固定行数的输出文件?

    假设我们有 N 个具有不同行数的输入文件 我们需要生成输出文件 使得每个输出文件恰好有 K 行 最后一个输出文件可以有 是否可以使用单个 MR 作业来完成此操作 我们应该打开文件以便在reducer中显式写入 输出中的记录应该被打乱 tha
  • 父子表记录-构建SQL查询

    这是我的表格和这些表格的数据 表名 Code CID Code 1 abc 2 def 3 xyz 表名 Details ID Name CID 1 a 1 2 b 2 结果表 ID Code Name 1 abc a 2 abc Null
  • 数据库中的额外查询或额外列哪个更好?

    对于可用时间非常短的数据来说 额外的查询或数据库中的额外列更好 示例 在子用户管理的情况下 我在主用户 表中添加一列额外的 super user id 并在用户类型为 sub user 且默认列值为 1 时进行输入 或者我创建新表并管理该表
  • 您如何处理标准库的signed char -> int 问题?

    这是我工作中一个长期存在的问题 我意识到我still没有好的解决办法 C 天真地为 int 定义了它的所有字符测试函数 int isspace int ch 但是字符通常是带符号的 并且完整的字符通常不适合 int 或用于字符串的任何单个存
  • 如何渲染响应?

    我正在使用 render to response 将列表发送到模板 我正在使用 django 快捷方式 锄头要这么做吗 如何使用变量设置上下文实例 from django shortcuts import render to respons
  • C#:将设置导入文件/从文件导出设置

    从应用程序内将应用程序内部设置导入 导出到文件中的最佳方法是什么 我有 Settings settings 文件 与设置文件绑定的 winform UI 并且我想要导入 导出设置 类似于 Visual Studio 导入 导出设置功能 如果
  • 如何测试 ANT 中的目录是否为空?

    如何测试 ant 中的目录是否为空 您可以使用pathconvert http ant apache org manual Tasks pathconvert html任务来做到这一点 与setonempty财产
  • Lua中如何对数字表求和?

    Lua有内置的吗sum 功能 我似乎找不到一个 我几乎翻遍了文档中的所有地方 或许table sum 或类似的东西 以遵循当前的约定 但由于我找不到它 我不得不实现它 function sum t local sum 0 for k v i
  • Magento - 检查管理员和客户是否登录

    我有一个安装了 Magento 1 4 0 1 的 Web 服务器 我有另一个与之共享凭据的网站 我已经设法检查客户是否登录 在更改 Magento 中的 cookie 位置之后 但是当我还尝试确定管理员是否登录时 事情变得复杂 我只能得到
  • 当标题顺序更改时,带有状态保存的数据表过滤器会导致问题

    我有一个html页面和一些 javascript 代码 下面是我的工作html table class table table hover thead tr th class color white Employee ID th th cl
  • 检查用户是否是 SQL Server 中 dbo 角色的成员

    我需要一个 T SQL 语句来检查用户是否是 SQL Server 中数据库角色的成员 具体来说 我需要知道用户是否是 dbo 角色的成员 因为这样我就不必向该用户授予额外的权限 如果我尝试在用户为 dbo 时添加额外权限 则会失败 并且我
  • 在同一端口上支持 IPv6 和 IPv4 的 C# 服务器

    是否有可能有一个同时侦听和接受 IPv6 和 IPv4 客户端的 Socket 我在 C 中使用了 IPv6 套接字 希望它能自动向后兼容 但 IPv4 客户端会导致无效的 ip 地址异常 看一看 您可以接受 IPv4 客户端以及 IPv6
  • 有关如何部署 C++ 代码以在任何地方工作的提示

    我不是在谈论制作可移植代码 这更多的是一个分配问题 我有一个中型项目 它对常用库有几个依赖项 例如 openssl zlib 等 它在我的机器上编译得很好 现在是时候将它呈现给世界了 本质上是构建最好的工程 我想制作适用于 Windows
  • 当所有其他列都保证相同时,仅从 CSV 文件中读取选定的列

    我有一堆 CSV 文件 我试图将它们连接成一个 csv 文件 CSV 文件由一个空格分隔 如下所示 initial pos orientation ratio chr 106681 0 06 chr 106681 0 88 chr 1066
  • 选择 Haskell 解析器

    有很多开源的解析器实现 http hackage haskell org packages archive pkg list html cat parsing我们可以在 Haskell 中使用 Parsec http hackage has
  • 编辑就地 Swing 组件

    有谁知道 Swing 组件本质上是电子表格 允许就地编辑并且可以 以某种方式 绑定到数组 如果您不需要任何花哨的东西 您可以使用标准秋千JTable 参见例如here http download oracle com javase tuto
  • 子视图图层变换和布局Subviews

    我的问题与 UIView CALayer 变换触发超级视图中的layoutSubviews https stackoverflow com questions 24632876 uiview calayer transform trigge
  • 需要使 PowerShell 脚本更快

    我自学了 Powershell 所以我不知道它的一切 我需要搜索一个数据库 其中包含我输入的确切行数 数据库是预定义的 它包含 gt 11800 个条目 您能帮我找出是什么原因导致速度变慢吗 Code Dict Get Content C