![在管道中缓冲无限量数据的实用程序?](https://linux22.com/image/18123/%E5%9C%A8%E7%AE%A1%E9%81%93%E4%B8%AD%E7%BC%93%E5%86%B2%E6%97%A0%E9%99%90%E9%87%8F%E6%95%B0%E6%8D%AE%E7%9A%84%E5%AE%9E%E7%94%A8%E7%A8%8B%E5%BA%8F%EF%BC%9F.png)
是否有一个实用程序可以插入管道中以解耦读取和写入速度?
$ producer | buf | consumer
基本上,我想要一个实用程序buf
能够尽快读取其输入,并将其存储在内存中,以便在尽可能快地运行的consumer
同时享受其甜蜜的时光。producer
答案1
这pv
(管道查看器)实用程序可以执行此操作(使用选项-B
)以及更多操作,包括为您提供进度报告。
答案2
您可以使用dd
:
producer | dd obs=64K | consumer
它在每个 UNIX 上都可用。
答案3
看一眼缓冲区。它可以缓冲到内存或内存映射文件(-t
/ -T
)。
答案4
非标准移动:使用套接字缓冲区。
例子:
# echo 2000000000 > /proc/sys/net/core/wmem_max
$ socat -u system:'pv -c -N i /dev/zero',sndbuf=1000000000 - | pv -L 100k -c -N o > /dev/null
i: 468MB 0:00:16 [ 129kB/s] [ <=> ]
o: 1.56MB 0:00:16 [ 101kB/s] [ <=> ]
为此实施了两个额外的工具:缓冲管道和映射opentounixsocket
$ ./buffered_pipeline ! pv -i 10 -c -N 1 /dev/zero ! $((20*1000*1000)) ! pv -i 10 -L 100k -c -N 2 ! > /dev/zero
1: 13.4MB 0:00:40 [ 103kB/s] [ <=> ]
2: 3.91MB 0:00:40 [ 100kB/s] [ <=> ]