首页 > 解决方案 > 在 PowerShell 中处理大型数组

问题描述

我很难理解在 PowerShell 中处理大型数据集/数组的最有效方法。我有包含数百万个需要处理和分组的项目的数组。这个列表的大小总是不同的,这意味着它可能是 350 万件或 1000 万件。

示例:他们按“4”分组的 350 万个项目,如下所示:

项目 0,1,2,3 组合在一起 4,5,6,7 组合在一起,依此类推。

我尝试通过循环遍历列表并分配给一个 pscustomobject 来使用单个线程处理数组,该对象只需 45-50 分钟即可完成。

我还尝试将数组分解为更小的数组,但这会导致进程运行时间更长。

$i=0
$d_array = @()
$item_array # Large dataset


While ($i -lt $item_array.length){

    $o = "Test"
    $oo = "Test"
    $n = $item_array[$i];$i++
    $id = $item_array[$i];$i++
    $ir = $item_array[$i];$i++
    $cs = $item_array[$i];$i++

    $items = [PSCustomObject]@{
        'field1' = $o
        'field2' = $oo
        'field3' = $n
        'field4' = $id
        'field5' = $ir
        'field6'= $cs
    }
    $d_array += $items

}

我可以想象,如果我应用一个允许我运行多个作业的作业调度程序,会大大减少处理时间,但我想让其他人采取一种快速有效的方法来解决这个问题。

标签: arrayspowershellpowershell-jobs

解决方案


虽然rokumaru的版本是无与伦比的,但在这里我尝试使用js2010的本地测量

同样$item_array = 1..100000适用于所有版本

> .\SO_56406847.ps1
measuring...BDups
measuring...LotPings
measuring...Theo
measuring...js2010
measuring...rokumaru
BDups    = 75,9949897 TotalSeconds
LotPings = 2,3663763 TotalSeconds
Theo     = 2,4469917 TotalSeconds
js2010   = 2,9198114 TotalSeconds
rokumaru = 0,0109287 TotalSeconds

## Q:\Test\2019\06\01\SO_56406847.ps1
$i=0
$item_array = 1..100000  # Large dataset

'measuring...LotPings'
$LotPings = measure-command {
    $d_array = for($i=0;$i -lt $item_array.length;$i+=4){
        [PSCustomObject]@{
            'field1' = "Test"
            'field2' = "Test"
            'field3' = $item_array[$i]
            'field4' = $item_array[$i+1]
            'field5' = $item_array[$i+2]
            'field6' = $item_array[$i+3]
        }
    }
} # measure-command

推荐阅读