sorting - Powershell排序非常大的对象集合

标签 sorting powershell collections

我正在尝试从大量对象(-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/

相关文章:

collections - firestore 子集合的优点

java - Java 中的 SQL IN 条件

c# 对 List<KeyValuePair<int, string>> 进行排序

javascript - 按优先选择排序的更高效的方式

sql - Powershell 对列进行排序

Windows Server 2012 R2 - 错误 : Server Manager is collecting inventory data. 向导将在数据收集完成后可用

c# - Collection<T> 类及其用途

java - 是否按非传递比较器 "work"排序?

从 C 脚本调用 Perl 脚本,对文本文件进行排序

windows - 替换 Windows 中整个子文件夹中文件名中的所有 #