【问题标题】:Powershell sort piped to get-content & sort takes over machinePowershell 排序管道以获取内容和排序接管机器
【发布时间】:2014-08-20 13:21:35
【问题描述】:

我复制和粘贴的速度有点过快,然后运行了下面的代码。它基本上将整个服务器冻结了 15-20 分钟。我的输入文件是一个 8 MB 的 xml 文件,其中包含大约 50,000 行文本。

get-content $latestFile.FullName  | sort | get-content $latestFile.FullName  | sort | out-file -FilePath $latestFile.FullName.Replace(".xml","_Sorted.xml") -Encoding ASCII  
get-content $latestFile2.FullName | sort | get-content $latestFile2.FullName | sort | out-file -FilePath $latestFile2.FullName.Replace(".xml","_Sorted.xml") -Encoding ASCII

那么上面的具体是做什么的呢? Powershell 如何或为什么允许您将任何内容通过管道传输到 get-content 或字符串?它是“将行相乘,类似于 SQL 笛卡尔积吗? 为什么它会接管 CPU 和内存?它甚至将远程桌面冻结到服务器,整个 GUI 被锁定,以便您可以使用任务管理器查看发生了什么? Windows 不会只是更慢地处理它,而不是将其所有资源专用于这个愚蠢和意外的错字吗?

这是我打算做的,运行时间大约为 30 秒。

get-content $latestFile.FullName  | sort | out-file -FilePath $latestFile.FullName.Replace(".xml","_Sorted.xml") -Encoding ASCII  
get-content $latestFile2.FullName | sort | out-file -FilePath $latestFile2.FullName.Replace(".xml","_Sorted.xml") -Encoding ASCII  

【问题讨论】:

    标签: sorting powershell memory-management cpu-usage


    【解决方案1】:

    这里有几个问题,我将尝试回答与“PowerShell 在做什么?”相关的问题

    我用一个 8 行文件进行了一个简单的测试。我跑了以下

    gc .\MyFile.txt | sort | gc .\MyFile.txt
    

    结果是 MyFile.txt 的内容被回显了 8 次(即 8x8=64 行输出)。因此,如果您的文本文件中有 50,000 行,那么您将排序 2,500,000,000 行并将它们写入文件。似乎是一个可能需要大量 CPU 时间和内存的操作。

    查看Get-Content on MSDN 的文档,我们看到它接受来自管道ByPropertyName 的一些值。我使用this question 的答案来尝试找出正在传输的参数。我跑了

    gc .\MyFile.txt | sort | gm
    

    并且看到它有一个 ReadCount 属性(嗯,返回数组的每个元素都有......)。对我来说,这表明到第二个 Get-Content 的管道正在从每个元素中获取 ReadCount。文档说

    此参数不会改变显示的内容,但会影响显示内容所需的时间。随着 ReadCount 值的增加,返回第一行所需的时间会增加,但操作的总时间会减少。这可以在非常大的项目中产生明显的差异。

    所以如果 sort 返回的数组中每个元素的 ReadCount 很大,结合上面的算法,我认为这可能需要相当长的时间,并锁定你的远程连接。

    【讨论】:

    • 谢谢,很好的解释!似乎 Windows 不会让一项任务占用整台计算机。我在 PerfMon 日志中看到了内存峰值。
    猜你喜欢
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多