针对大分隔文件上的聚合操作的Powershell性能调整
我有一个带分隔符的文件,有350列。分隔符是针对大分隔文件上的聚合操作的Powershell性能调整,powershell,file,delimited,group-object,Powershell,File,Delimited,Group Object,我有一个带分隔符的文件,有350列。分隔符是\034(字段分隔符)。 我必须提取一个特定的列值,并找出文件中该列的每个不同值的计数。如果distinct值的计数大于或等于2,则需要将其输出到文件。 源文件为1GB。我已经写了下面的命令。它非常慢 Get-Content E:\Test\test.txt | Foreach {($_ -split '\034')[117]} | Group-Object -Property { $_ } | %{ if($_.Count -ge 2) {
\034(字段分隔符)
。
我必须提取一个特定的列值,并找出文件中该列的每个不同值的计数。如果distinct值的计数大于或等于2,则需要将其输出到文件。
源文件为1GB。我已经写了下面的命令。它非常慢
Get-Content E:\Test\test.txt | Foreach {($_ -split '\034')[117]} | Group-Object -Property { $_ } | %{ if($_.Count -ge 2) { Select-Object -InputObject $_ -Property Name,Count} } | Export-csv -Path "E:\Test\test2.csv" -NoTypeInformation
请帮忙 我建议使用a快速处理输入文件(按照PowerShell标准):
帽子尖到,用于建议-NoElement
开关,该开关仅通过维护抽象的组信息来简化组对象
调用;也就是说,只有分组标准(如.Name
所示)通过输出对象返回,而不包括组成组的单个对象(如.group
所示)
至于你所尝试的:
- 管道中的逐行流传输速度很慢,通常(逐对象传递会带来开销),特别是因为
用ETS(扩展类型系统)元数据装饰它输出的每一行Get Content
- 建议添加一种退出此装饰的方法
开关将整个文件作为一个多行字符串读取,速度更快,这会消耗内存并可能增加行拆分的工作量-Raw
- 没有必要将
传递到,只需忽略它即可。如果没有-Property{$\code}
参数,输入对象将作为一个整体进行分组-Property
- 链接和-而不是通过调用中的
语句与多个if
调用相结合进行过滤-不仅在概念上更清晰,而且性能更好Select Object
我建议使用a快速处理输入文件(按照PowerShell标准): 建议使用
-NoElement
开关的提示,该开关通过仅维护抽象的组信息来简化组对象
调用;即,仅维护分组标准(如.Name
所示),而不包括组成组的单个对象(如.Group
所示)通过输出对象返回
至于你所尝试的:
- 管道中的逐行流传输速度很慢,通常(逐对象传递会带来开销),特别是因为
用ETS(扩展类型系统)元数据装饰它输出的每一行Get Content
- 建议添加一种退出此装饰的方法
开关将整个文件作为一个多行字符串读取,速度更快,这会消耗内存并可能增加行拆分的工作量-Raw
- 没有必要将
传递到,只需忽略它即可。如果没有-Property{$\code}
参数,输入对象将作为一个整体进行分组-Property
- 链接和-而不是通过调用中的
语句与多个if
调用相结合进行过滤-不仅在概念上更清晰,而且性能更好Select Object
你试过了吗?<代码>获取内容我也会考虑拆分处理。有那么多的列和它被管道化的方式,它必须在大量的内存处理之前才能产生结果。真的只是<代码>导入CSV ,也许把单列导出到另一个文件中。你试过了吗?此外,
foreach
循环慢,循环中包含所需的逻辑。@SantiagoSquarzon,是的,Group Object
很慢;-NoElement
,正如Mathias所建议的,应该会有所帮助,但最好的解决方案是维护一个哈希表,将字段值映射到它们的计数as是switch
语句的一部分,但这需要更多的工作。这很好,Group Object
tho,根据我的经验,往往比正常的foreach
循环慢,里面有所需的逻辑。@SantiagoSquarzon,是的,Group Object
很慢;-NoElement
,正如Mathias所建议的,应该有帮助,但是这里最好的解决方案是维护一个哈希表,将字段值映射到它们的计数,作为switch
语句的一部分,但是这需要更多的工作。
# Get an array of all the column values of interest.
$allColValues = switch -File E:\Test\test.txt {
default { # each input line
# For better performance with *literal* separators,
# use the .Split() *method*.
# Generally, however, use of the *regex*-based -split *operator* is preferable.
$_.Split([char] 0x1c)[117] # hex 0x1c is octal 034
}
}
# Group the column values, and only output those that occur at least
# twice.
$allColValues | Group-Object -NoElement | Where-Object Count -ge 2 |
Select-Object Name, Count | Export-Csv E:\Test\test2.csv -NoTypeInformation