Powershell:使用“ Out-File”进行写入时,较小的文件需要30倍的时间

我正在获取文件的内容,并仅保留与正则表达式或空行匹配的行。但是写结果,例如数据量较小,需要花费很多时间... 这是有问题的代码(我添加了几行用于调试/测量):

$original = Get-Content "$localDir\$ldif_file"
(Measure-Command -Expression { $original | Out-File "$localDir\Original-$ldif_file" }).TotalSeconds
$lines = ($original | Measure-Object -Line).Lines
"lines of `$original = $lines"

# Just keep lines of interest:
$stripped = $original | select-string -pattern '^custom[A-Z]','^$' -CaseSensitive
$lines = ($stripped | Measure-Object -Line).Lines
"lines of `$stripped = $lines"
(Measure-Command -Expression { $stripped | Out-File "$localDir\Stripped-$ldif_file" }).TotalSeconds

"done"

问题:将较小($ stripped)的数据写入文件需要342秒(比$原始数据长30倍)!参见下面的输出:

11.5371677
lines of $original = 188715
lines of $stripped = 126404
342.6769547
done

为什么$ str的Out-File比$ original的文件慢了这么多? 如何改进?

谢谢!

duoluoyouhun 回答:Powershell:使用“ Out-File”进行写入时,较小的文件需要30倍的时间

补充Mathias' helpful answer

  • PowerShell 7 中,Select-String现在支持 -Raw开关,该开关仅输出个字符串 (匹配的行),这将大大加快命令的速度。

    • Windows PowerShell 中效率较低的情况下,您可以Select-String通话包含在(...).Line 中以获得仅作为字符串的行。

    • 还请注意,如果直接向 Select-String传递文件路径 (以便它读取文件本身),则会更快。而不是通过Get-Content用管道输送单个线路。

  • 通常,对于编写已经为 strings 的对象,与Set-Content相比,Out-File是更好且更快的选择

    • 有关背景信息,请参见this answer,有关性能比较,请参见this answer的底部。

    • 字符编码警告(有关背景,请参见this answer):

      • Windows PowerShell 中,Set-Content默认为ANSI编码,而Out-File默认为“ Unicode”(UTF-16LE);根据需要使用-Encoding
      • 幸运的是, PowerShell [Core] 6 + 使用一致的默认值,即不带BOM的UTF-8。
  • 通过管道传递集合 可能很慢; 对于已完全存储在内存中的集合来说,将它们作为整体传递给 argument 明显更快- >假设目标cmdlet支持 -Set-Content的{​​{1}}参数确实

将它们放在一起:

-Value
,

您真的在这里比较苹果和橙子。

<meta name="viewport" content="width=device-width,initial-scale=1.0"> <div id="main"> <div id="left"> <nav> <div> <h1>ll</h1> <p>zwerrrrrrss</p> <p>werghhh</p> <br> <p>zdeeeeeu</p> <br> <p>awer7</p> </div> </nav> </div> <div id="right"> <header> <div> <p>lkwwss</p> </div> </header> </div> </div> 包含18.9万个 strings ,但是$ stripped包含12.6万个$original对象,这些对象必须在管道中一对一地转换为字符串。

使用MatchInfo运算符代替保留原始字符串输入值,您会发现将它们输出到文件中的速度更快:

-cmatch
本文链接:https://www.f2er.com/2610831.html

大家都在问