繁体   English   中英

Powershell如何提高Where-Object函数的运行速度

[英]Powershell how to improve the speed of the Where-Object function

我有两个 CSV 文件。 第一个 CSV 是 Card Data,它包含大约 30,000 条记录并包含卡的名称、UUID 和价格(当前为空)。 第二个 CSV 是定价数据,它包含大约 50,000 条记录并包含 UUID 和该特定 UUID 的一些定价信息。

这是在别处生成的两个单独的 CSV 文件。

对于卡片数据 CSV 中的每条记录,我使用 PowerShell 中的Where-Object函数获取 UUID 并在定价数据 CSV 中查找相应的 UUID。 这样我就可以找到相应卡的定价信息,并通过定价算法运行该信息,为卡数据 CSV 中的每条记录生成价格。

目前,卡片数据 CSV 文件中的每条记录似乎需要大约 1 秒,而要处理 30,000 条记录,则需要 8 多个小时才能完成。 是否有更好更有效的方法来执行此任务。

代码:

Function Calculate-Price ([float]$A, [float]$B, [float]$C) {
    #Pricing Algorithm
    ....

    $Card.'Price' = $CCPrice
}

$PricingData = Import-Csv "$Path\Pricing.csv"
$CardData = Import-Csv "$Update\Cards.csv"

Foreach ($Card In $CardData) {
    $PricingCard = $PricingData | Where-Object { $_.UUID -eq $Card.UUID } 
    . Calculate-Price -A $PricingCard.'A-price' -B $PricingCard.'B-price'  -C $PricingCard.'C-price' 
}

$CardData | Select "Title","Price","UUID" | 
    Export-Csv -Path "$Update\CardsUpdated.csv" -NoTypeInformation

第一个 CSV 是 Card Data,包含大约30,000 条记录

第二个 CSV 是定价数据,其中包含大约50,000 条记录

难怪它很慢,您正在计算表达式$_.UUID -eq $Card.UUID ~1500000000(即 15 亿或 15 亿)次 - 这听起来计算量很大,我们甚至没有考虑管道的开销必须将输入参数绑定到Where-Object的次数相同。


不是直接使用Import-Csv返回的对象数组,而是使用哈希表根据您稍后加入的属性“索引”您需要搜索的数据集中的记录!

$PricingData = Import-Csv "$Path\Pricing.csv"
$CardData = Import-Csv "$Update\Cards.csv"

$PricingByUUID = @{}
$PricingData |ForEach-Object {
    # Let's index the price cards using their UUID value
    $PricingByUUID[$_.UUID] = $_
}

Foreach ($Card In $CardData) {
    # No need to search through the whole set anymore
    $PricingCard = $PricingByUUID[$Card.UUID]
    . Calculate-Price -A $PricingCard.'A-price' -B $PricingCard.'B-price'  -C $PricingCard.'C-price' 
}

在幕后,哈希表(以及 .NET 中的大多数其他字典类型)的实现方式使它们具有极快的恒定时间查找/检索性能 - 这正是您在这种情况下想要的那种东西!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM