如果我在bash中读取LINE循环,从stdin读取大量输入效率非常低,因为它根本没有缓冲。Bash read LINE vs read -n LINE
将使用while read -n 4096 LINE提供允许bash更有效地执行大输入读取的临时缓冲?
如果我在bash中读取LINE循环,从stdin读取大量输入效率非常低,因为它根本没有缓冲。Bash read LINE vs read -n LINE
将使用while read -n 4096 LINE提供允许bash更有效地执行大输入读取的临时缓冲?
号可以验证读取与执行一次一个:
echo foo | strace bash -c 'read -n 100 f'
,看到单一的读取需要4所系统调用。但很容易完成你想要的。把多达4096个字节从标准输入到一个变量,使用过程中替换:
bash -c 'r=$(dd bs=4096 count=1 2> /dev/null); echo "$r"'
用fork和exec替换几个读取:) –
那些读取限制处理剧烈,阅读一半gig文本文件与读取LINE是一个5分钟的过程,并且我有一个70GB的文本文件。我会用一个大缓冲区来尝试这种技术,例如1mb –
实际上,这种开销的绝大部分都是对简单命令的重复评估。 Bash对于评估命令有特别高的开销 - 特别是简单的命令。考虑到所有涉及的步骤,这是可以理解的,但其他炮弹趋向于优化更多。任何需要执行任何内建的紧密循环都会对使用Bash重复付出巨大的代价。如果你可以使用'mapfile'离开,这是一个巨大的改进,只是由于取出循环。一般情况下复合命令的速度也要快得多(比如'((())')。 – ormaaj