簡體   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