【问题标题】:Add a big buffer to a pipe between two commands在两个命令之间的管道中添加一个大缓冲区
【发布时间】:2021-03-30 00:11:41
【问题描述】:

给定一个表单的 bash 命令行

commandA | commandB

我想添加一个大小约为 1MB 的缓冲区,位于 commandAcommandB 之间。 我希望能够用某种形式来做到这一点

commandA | BUFFER | commandB

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

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

【问题讨论】:

    标签: bash unix


    【解决方案1】:

    BUFFER 称为缓冲区。 (man 1 缓冲区,可能在 apt-get install buffer 之后)

    【讨论】:

    • 应该传递给缓冲区以获取 a 的选项是什么,例如。 1Gb 缓冲区大小?似乎有很多选项可以配置块大小、块数等等,但我不清楚使用哪些选项来获得给定大小的简单缓冲区。
    • -m size 是总数。如果您需要更细粒度的控制,请一起使用-s blocksize -b blocks
    【解决方案2】:

    还有另一个工具,pv - 管道查看器:

    process1 | pv -pterbTCB 1G | process2
    
    • B 指定缓冲区大小,此处为 1 GB
    • C 禁用 splice,这是 B 所必需的
    • T 显示缓冲区级别
    • pterb 是由于存在T 而需要的默认显示开关

    pv 可能在mbuffer/buffer 不在官方存储库中的系统上可用(例如arch linux)。

    【讨论】:

    • 我尝试使用pv 作为缓冲区,但是当缓冲区未满时输出阻塞时,它有时会停止读取其输入。这似乎是一个错误,因为附加 strace 修复了它。带有缓冲区的pv 也每 100 毫秒在读取和写入之间切换,或者直到没有更多数据准备好,但是当我尝试它时,这减慢了从磁盘读取的速度。我猜 100 毫秒的间隔对于系统来说太长了,无法继续向前读取。
    【解决方案3】:

    你可以使用

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

    例如

        process1 | mbuffer -m 1024M | process2
    

    使用 1G 缓冲区

    【讨论】:

    • mbuffer 似乎比缓冲区好得多,因为缓冲区(根据手册页和我的实验)限制为 1GB。
    【解决方案4】:

    程序buffer 使用共享内存。这可能是个问题,因为在发生错误的情况下,内存可能会泄漏,因为共享内存可以比分配内存的程序寿命更长。

    替代方案可能是 GNU dd:

    commandA |
    dd status=none iflag=fullblock bs=1M |
    commandB
    

    使用fullblock 选项很重要。否则dd 在从管道读取时可能会导致数据丢失。

    dd的参数说明

    • 状态=无

      设置打印到stderr的信息级别; 'none' 禁止显示除错误消息以外的所有内容

    • iflag=fullblock

      累积完整的输入块

    • bs=1M

      一次读取和写入最多 1 兆字节(默认:512 字节);

    【讨论】:

      【解决方案5】:

      或者,您可以使用命名管道并并行运行它们:

      mkfifo myfifo
      commandB < myfifo &
      commandA > myfifo
      rm myfifo
      

      【讨论】:

      • 只缓冲大约 64KB - 不大。
      • 此解决方案的缓冲区大小与commandA | commandB 相同。
      猜你喜欢
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 2016-09-25
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 2011-12-13
      相关资源
      最近更新 更多