我正在尝试从非常大的对象集合(-gt 250k)生成直方图。我需要在每个对象的属性上对集合进行排序。我的脚本行如下:
$ch = $ch | sort TotalCount -descending <br>
其中$ch[x].totalcount
是一个整数。
该脚本可以运行但需要一个多小时才能排序并消耗6GB内存。我该如何加快这个过程?
我已经做了一些搜索解决方案,一些网站建议使用[array] :: sort,因为它更快。由于这是一个对象集合,我不确定如何使用静态System.Array
排序方法。即使我可以,我也看不到如何使数组下降(尽管反转结果应该非常简单)。
有关如何使用PowerShell对真正大型集合进行排序的任何建议吗?
答案 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()不会以任何方式对数组进行排序。