[英]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.