给出表单
的bash命令行commandA | commandB
我想在commandA
和commandB
之间添加一个大小约为1MB的缓冲区。
我希望能够以某种形式
commandA | BUFFER | commandB
但是BUFFER
使用的命令是什么?
备注:我想这样做是为了解耦这两个命令以使它们更好地并行化。问题是commandB
以大块处理数据,这意味着commandA
阻塞,直到commandB
完成一个块。所以一切都顺序进行: - (
答案 0 :(得分:21)
BUFFER称为缓冲区。 (man 1缓冲区,也许是在apt-get安装缓冲区之后)
答案 1 :(得分:10)
还有另一个工具,pv
- 管道查看器:
process1 | pv -pterbTCB 1G | process2
B
指定缓冲区大小,此处为1 Gigibyte C
停用了splice
B
T
显示缓冲级别pterb
,T
是所需的默认显示切换
pv
可能适用于mbuffer/buffer
不在官方存储库中的系统(例如arch linux
)。
答案 2 :(得分:6)
您可以使用
E.g。
process1 | mbuffer -m 1024M | process2
使用1G缓冲区
答案 3 :(得分:3)
程序buffer
使用共享内存。这可能是一个问题,因为在发生错误的情况下,内存可能会泄漏,因为共享内存可能会超出分配内存的程序的寿命。
另一个选择可以是GNU dd
:
commandA |
dd status=none iflag=fullblock bs=1M |
commandB
使用fullblock
选项很重要。否则,dd
可能会在从管道中读取数据时导致数据丢失。
dd
的参数说明
status = none
设置要打印到stderr的信息级别; 'none'抑制除了错误消息之外的所有内容
iflag = fullblock
累积完整的输入块
bs = 1M
一次最多读写一个兆字节(默认值:512字节);
答案 4 :(得分:-2)
或者您可以使用命名管道并行并行运行:
mkfifo myfifo
commandB < myfifo &
commandA > myfifo
rm myfifo