2012-12-07 46 views
1

如果我在bash中读取LINE循环,从stdin读取大量输入效率非常低,因为它根本没有缓冲。Bash read LINE vs read -n LINE

将使用while read -n 4096 LINE提供允许bash更有效地执行大输入读取的临时缓冲?

回答

2

号可以验证读取与执行一次一个:

echo foo | strace bash -c 'read -n 100 f' 

,看到单一的读取需要4所系统调用。但很容易完成你想要的。把多达4096个字节从标准输入到一个变量,使用过程中替换:

bash -c 'r=$(dd bs=4096 count=1 2> /dev/null); echo "$r"' 
+1

用fork和exec替换几个读取:) –

+0

那些读取限制处理剧烈,阅读一半gig文本文件与读取LINE是一个5分钟的过程,并且我有一个70GB的文本文件。我会用一个大缓冲区来尝试这种技术,例如1mb –

+1

实际上,这种开销的绝大部分都是对简单命令的重复评估。 Bash对于评估命令有特别高的开销 - 特别是简单的命令。考虑到所有涉及的步骤,这是可以理解的,但其他炮弹趋向于优化更多。任何需要执行任何内建的紧密循环都会对使用Bash重复付出巨大的代价。如果你可以使用'mapfile'离开,这是一个巨大的改进,只是由于取出循环。一般情况下复合命令的速度也要快得多(比如'((())')。 – ormaaj

1

-N(而不是-n)选项将读取过去一个换行符。

+0

Yep'-N'很好。几乎总是比'-n' IMO更有用。可惜它在Bash中更新颖。 – ormaaj