powershell排序真的很大的对象集合

时间:2014-12-31 16:05:04

标签: sorting powershell collections

我正在尝试从非常大的对象集合(-gt 250k)生成直方图。我需要在每个对象的属性上对集合进行排序。我的脚本行如下:

$ch = $ch | sort TotalCount -descending  <br>

其中$ch[x].totalcount是一个整数。

该脚本可以运行但需要一个多小时才能排序并消耗6GB内存。我该如何加快这个过程?

我已经做了一些搜索解决方案,一些网站建议使用[array] :: sort,因为它更快。由于这是一个对象集合,我不确定如何使用静态System.Array排序方法。即使我可以,我也看不到如何使数组下降(尽管反转结果应该非常简单)。

有关如何使用PowerShell对真正大型集合进行排序的任何建议吗?

2 个答案:

答案 0 :(得分:0)

让我们创建一个包含2500个元素的数组。数组的每个元素都是一个包含属性totalCount的对象,我们为它分配一个整数。

$array = @()
1..2500 | % {
    $array += New-Object pscustomobject -Property @{
        totalCount = $_;
    }
}

现在让我们对这个数组进行排序并测量执行命令的总时间。

我们从使用Sort-Object参数的经典-descending开始:

(Measure-Command {
    $array = $array | Sort-Object TotalCount -descending
}).TotalSeconds  

以秒为单位的总时间为:0.1217965

现在让我们使用类System.Array的反向方法:[Array]::Reverse()

(Measure-Command {
    [Array]::Reverse([array]$array)
}).TotalSeconds  

以秒为单位的总时间为:0.0002594

相当不同!

现在让我们看看其他可能性,让我们创建一个System.Collections.ArrayList

$array = New-Object System.Collections.ArrayList
1..2500 | % {
    $o = New-Object pscustomobject -Property @{
        totalCount = $_;
    }
    [Void] $array.Add($o)
}

我们咆哮并重复。我们首先使用System.Collections.ArrayList类的Reverse方法,然后将集合传递给System.Array的Reverse方法。

(Measure-Command {
    $array.reverse()
}).TotalSeconds

以秒为单位的总时间为:0.0002459

略有改善,但总体上非常相似。

现在我们对系统集合进行类型转换并使用[Array]::Reverse()

(Measure-Command {
    [Array]::Reverse([array]$array)
}).TotalSeconds

以秒为单位的总时间为:0.0008172 超过两倍的时间。这清楚地表明它不是一个好主意,所以我们废弃它。

结论:

带有[Array]::Reverse()的System.Array肯定比Sort-Object快,但请记住System.Array是不可变的,所以如果构建数组是性能问题的一部分,我肯定会建议使用System.Collections.ArrayList,因为它是可变的。

答案 1 :(得分:0)

[array] :: reverse()不会以任何方式对数组进行排序。