我正在尝试从大量对象(-gt 250k)生成直方图。我需要对每个对象的属性对集合进行排序。我的脚本行如下所示:
$ch = $ch | sort TotalCount -descending <br>
其中
$ch[x].totalcount
是一些整数。该脚本可以运行,但需要一个多小时才能进行排序,并占用6GB的内存。如何加快流程?
我已经做了一些寻找解决方案的搜索,并且几个网站建议使用[array]::sort,因为它要快得多。由于这是对象的集合,因此我不确定如何使用静态
System.Array
排序方法。即使可以,我也看不到如何使数组降序(尽管反转结果应该非常简单)。关于如何使用Powershell对大型收藏进行排序的任何建议?
最佳答案
让我们创建一个包含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的Reverse方法:
[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
,因为它是可变的。
关于sorting - Powershell排序非常大的对象集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27723471/