一尘不染

与cat相比,bash同时读取循环极慢,为什么呢?

linux

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

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

当我这样做时cat my450klinefile.txt | myscript,CPU锁定为100%,它每秒可以处理大约1000行。大约需要5分钟来处理`cat my450klinefile.txt

/dev/null`半秒钟内的操作。

有没有一种 更有效的方法
来执行此操作。我只需要从stdin中读取一行,计算字节数,然后将其写到命名管道中即可。但是,即使这个例子的速度也不可能太慢。

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


阅读 249

收藏
2020-06-02

共1个答案

一尘不染

原因while read很慢,因为需要外壳程序对每个字节进行系统调用。它不能从管道读取较大的缓冲区,因为外壳程序不得从输入流读取多行内容,因此必须将每个字符与换行符进行比较。如果您stracewhile read循环上运行,您可以看到此行为。此行为是可取的,因为它可以可靠地执行以下操作:

while read size; do dd bs=$size count=1 of=file$(( i++ )); done

其中循环内的命令从外壳程序读取的同一流中读取。如果外壳程序通过读取大缓冲区消耗了大量数据,则内部命令将无法访问该数据。不幸的副作用是,read它的运行速度太慢了。

2020-06-02