Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
针对大分隔文件上的聚合操作的Powershell性能调整_Powershell_File_Delimited_Group Object - Fatal编程技术网

针对大分隔文件上的聚合操作的Powershell性能调整

针对大分隔文件上的聚合操作的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) {

我有一个带分隔符的文件,有350列。分隔符是
\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
所示)


至于你所尝试的:

  • 管道中的逐行流传输速度很慢,通常(逐对象传递会带来开销),特别是因为
    Get Content
    用ETS(扩展类型系统)元数据装饰它输出的每一行

    • 建议添加一种退出此装饰的方法
    • -Raw
      开关将整个文件作为一个多行字符串读取,速度更快,这会消耗内存并可能增加行拆分的工作量
  • 没有必要将
    -Property{$\code}
    传递到,只需忽略它即可。如果没有
    -Property
    参数,输入对象将作为一个整体进行分组

  • 链接和-而不是通过调用中的
    if
    语句与多个
    Select Object
    调用相结合进行过滤-不仅在概念上更清晰,而且性能更好


我建议使用a快速处理输入文件(按照PowerShell标准):

建议使用
-NoElement
开关的提示,该开关通过仅维护抽象的组信息来简化
组对象
调用;即,仅维护分组标准(如
.Name
所示),而不包括组成组的单个对象(如
.Group
所示)通过输出对象返回


至于你所尝试的:

  • 管道中的逐行流传输速度很慢,通常(逐对象传递会带来开销),特别是因为
    Get Content
    用ETS(扩展类型系统)元数据装饰它输出的每一行

    • 建议添加一种退出此装饰的方法
    • -Raw
      开关将整个文件作为一个多行字符串读取,速度更快,这会消耗内存并可能增加行拆分的工作量
  • 没有必要将
    -Property{$\code}
    传递到,只需忽略它即可。如果没有
    -Property
    参数,输入对象将作为一个整体进行分组

  • 链接和-而不是通过调用中的
    if
    语句与多个
    Select Object
    调用相结合进行过滤-不仅在概念上更清晰,而且性能更好



你试过了吗?<代码>获取内容我也会考虑拆分处理。有那么多的列和它被管道化的方式,它必须在大量的内存处理之前才能产生结果。真的只是<代码>导入CSV ,也许把单列导出到另一个文件中。你试过了吗?此外,获取内容< /代码>我也会考虑拆分处理。有那么多的列和它被管道化的方式,它必须在大量的内存处理之前才能产生结果。真的只是<代码>导入CSV < /代码>,也许将单个列导出到另一个文件中。这很好,<代码>组对象<根据我的经验,code>tho往往比正常的
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