我试图理解命名管道在性能方面的表现。假设我有一个大文件,我正在解压缩,我想写一个命名管道(/ tmp / data):
gzip --stdout -d data.gz > /tmp/data
然后我稍后运行一个从管道中读取的程序:
wc -l /tmp/data
gzip什么时候实际解压缩数据,当我运行第一个命令时,或者当我运行第二个命令并且读取器连接到管道时?如果是前者,是将数据存储在磁盘上还是存储在内存中?
答案 0 :(得分:1)
管道(命名或其他)只有一个非常小的缓冲区(如果有的话) - 所以如果什么都没有读,那么就不会写任何东西(或很少)。
在您的示例中,gzip
在wc
运行之前会做很少的事情,因为在此之前,它编写输出的努力将会阻止。开箱即用的磁盘或内存中没有非平凡的缓冲区,但是如果你想要的话,存在可以为你实现这种缓冲的工具 - 请参阅pv及其{{1}参数,或不再维护的(并且,可悲的是,removed from Debian by folks who didn't understand its function) bfr 。