在两个命令之间向管道添加一个大缓冲区

时间:2011-12-18 20:28:58

标签: bash unix

给出表单

的bash命令行
commandA | commandB

我想在commandAcommandB之间添加一个大小约为1MB的缓冲区。 我希望能够以某种形式

来做到这一点
commandA | BUFFER | commandB

但是BUFFER使用的命令是什么?

备注:我想这样做是为了解耦这两个命令以使它们更好地并行化。问题是commandB以大块处理数据,这意味着commandA阻塞,直到commandB完成一个块。所以一切都顺序进行: - (

5 个答案:

答案 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)

您可以使用

  • 缓冲区(提及)
  • mbuffer(也适用于solaris,可能还有其他UNIX)

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