2011-10-17 299 views
0

我有一个awk脚本发出长串(> 10K字符)到标准输出。stdbuf用法:增加缓冲区大小

我想增加缓冲区大小,以便一次写入较大的那些长字符串块。我计时两个管道下面有不同的尺寸-o但没有显著变化

time stdbuf -o 100MB awk -f processing.awk infile.txt | sort -k1,1 > outfile.txt 
time stdbuf -o 100MB awk -f processing.awk infile.txt > outfile.txt 

真正/用户/ SYS时机都非常相似,oneanother(+ - 10%的每个指标)。

我的问题是我是否正确使用stdbuf?谢谢。

FZ。

回答

0

stdbuf命令设法更改执行命令的标准I/O通道的缓冲区。然而,它并不(我认为它不能)改变O/S中管道的容量。所以,我不希望看到任何性能差异。

注意,不同的是,大缓存,awk最终会在一个可怕的write()系统调用发送的所有数据(除非infile.txt,由脚本修改,本身大于100 MIB更大),而通常它会写入0.5到8 KiB之间的缓冲区。然而,这样一个巨大的write()的好处是最小的;它仍然需要被O/S分割以适应管道(除非O/S以不同的方式做事 - 典型地,我描述的是真实的)。

+0

谢谢。你有没有看到任何好处,保持在管道外,并在awk中显式转移输出(循环存储的字符串和> awk内的outfile.txt)? –

+0

如果您需要对数据进行排序,您将受益于保持缓冲区大小更小,以便'sort'获取数据,而'awk'也生成数据,因此您可以从多核在你的CPU。如果你让'awk'在产生任何输出前暂停,那么就没有并行性,整个过程将会变慢。在正常情况下,缓冲区的默认大小是可以的。我不希望看到修补缓冲区大小的二阶以上性能收益。 –

+0

谢谢你。非常有益的,有用的答案。 –

1

什么stdbuf确实被更改C STDLIB缓冲,即,stdinstdoutstderrFILE*缓冲区。

它不会更改内核中管道缓冲区的大小。这可能是你没有看到任何改变的原因。

这是一个众所周知的问题,管道缓冲区大小不能改变,而且很小。处理大文件时,最好将中间结果写入文件,而不是将它们传送到另一个应用程序中。由于管道缓冲区非常小,通过管道进行通信的应用程序之间将发生大量的上下文切换,其开销可能会使应用程序运行时间变得更短。

+0

谢谢。我没有意识到管道缓冲区已设置。 –