gpt4 book ai didi

performance - 有没有办法从大命令中更快地流出数据?

转载 作者:行者123 更新时间:2023-12-03 00:44:10 25 4
gpt4 key购买 nike

假设我正在使用 get-childitem c:\*.* -recurse我正在管道它。在管道处理它之前,我必须等待整个 get-childitem 命令完成。有一些异常(exception),例如 select -first 2它神奇地停止了上一个命令。无论如何,有没有办法提高输出,所以它立即写入而不是吸收大量的内存?我的一个想法是......(我知道这行不通,但它让这个想法得以传达)

[System.IO.File]::ReadLines("$(dir c:\*.* -recurse)")

我知道这是 Windows 的事情,因为 Linux 会在数据出现后立即处理它。但我知道,两个不同的世界。

我最担心的是内存使用...

这是一个很好的例子
(1..10000000) | where {$_ -like "*543*"}

这需要我的机器大约 100 秒

在哪里
(1..10000000).where({$_ -like "*543*"})

只用了 25 秒。

最佳答案

I have to wait for the whole get-childitem command to complete before the pipe handles it.



否: PowerShell 管道的重点是在对象可用时逐个处理它们,从而充当保持内存使用恒定的内存节流与输入集合的大小无关。
  • 警告 : 不要使用 (...)围绕您通过管道发送其输出的命令,因为这确实会首先在内存中完整地收集该命令的输出。
  • cmdlet ,作为 PowerShell 的 native 命令,天生就支持这种一对一的流式传输。
  • 但是,某些 cmdlet,例如 Sort-ObjectGroup-Object必须首先收集内存中的所有输入[1],作为概念上的必要性(例如,在比较所有项目之前,您无法生成排序输出)。谢谢,Bacon Bits .
  • 同样,ConvertTo-Json 等 cmdlet ,它只发出一个输出对象,从前面收集的整个输入中构造一个对象。
  • 类似地,来自 的 stdout 输出外部程序 当线路可用时,逐行通过。
  • 您可以转 表达式 通过将其包含在 & { ... } 中,将其放入流式命令中,但这仅在表达式尚未在内存中构建完整的对象集合时才有用;例如。,& { 1.. 10000000 } | ...不会给你带来任何好处,但是& { for ($i=0; $i -lt 10000000; ++$i) { $i } } | ...将。
  • 最终,如果源 cmdlet/程序/表达式本身不以流式方式发出输出对象(一个接一个,因为它们正在生成),那么你就不走运了。

  • 但是, 确实缺少的是按需停止管道处理的能力 - 目前只有 Select-Object -First可以做-见 this answer我的。
    有一个长期的 feature request on GitHub这需要一种机制来按需停止管道。

    顺便说一句:使用 PSv4+ .Where() method确实比使用 Where-Object cmdlet 快(其内置别名是 where ),但是 .Where()总是要求它操作的集合事先已全部加载到内存中。

    但是, .Where()方法确实有能力通过传递 'First' 来停止处理剩余的项目。作为第二个参数,在第一场比赛后停止; 'First' [System.Management.Automation.WhereOperatorSelectionMode] 的一个实例;比较性能 (1..1e6).Where({$_ -eq 10})到那个 (1..1e6).Where({$_ -eq 10}, 'First')
    [1] PowerShell 不像 Unix sort 那样使用临时文件来缓解内存压力例如,实用程序可以;我的猜测是,这样做在 PowerShell 中并不是一个真正的选择:PowerShell 处理事件对象(而不是静态字符串)的能力将带来重大的序列化/反序列化挑战,这是要使用的临时文件。

    关于performance - 有没有办法从大命令中更快地流出数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51852191/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com