gpt4 book ai didi

linux - 与 cat 相比,Bash while read 循环非常慢,为什么?

转载 作者:IT王子 更新时间:2023-10-29 00:39:11 26 4
gpt4 key购买 nike

这里是一个简单的测试脚本:

while read LINE; do
LINECOUNT=$(($LINECOUNT+1))
if [[ $(($LINECOUNT % 1000)) -eq 0 ]]; then echo $LINECOUNT; fi
done

当我做 cat my450klinefile.txt | myscript CPU 锁定在 100%,每秒可以处理大约 1000 行。处理 cat my450klinefile.txt >/dev/null 在半秒内执行的操作大约需要 5 分钟。

有没有一种更有效的方法来从本质上做到这一点。我只需要从 stdin 读取一行,计算字节数,然后将其写出到命名管道。但即使是这个例子的速度也慢得令人难以置信。

每 1Gb 的输入行我都需要执行一些更复杂的脚本操作(关闭和打开一些数据被馈送到的管道)。

最佳答案

while read 如此慢的原因是 shell 需要对每个字节进行系统调用。它不能从管道中读取大缓冲区,因为 shell 不能从输入流中读取超过一行,因此必须将每个字符与换行符进行比较。如果您在 while read 循环中运行 strace,您会看到这种行为。这种行为是可取的,因为它可以可靠地执行以下操作:

while read size; do test "$size" -gt 0 || break; dd bs="$size" count=1 of=file$(( i++ )); done

其中循环内的命令从 shell 读取的同一流中读取。如果 shell 通过读取大缓冲区来消耗大量数据,则内部命令将无法访问该数据。一个不幸的副作用是 read 慢得离谱。

关于linux - 与 cat 相比,Bash while read 循环非常慢,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13762625/

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