代码之家  ›  专栏  ›  技术社区  ›  sgt-hartman

高容量缓冲fifo或使用文件作为fifo的缓冲区

  •  2
  • sgt-hartman  · 技术社区  · 7 年前

    在bash脚本中,我使用以下方法将命令的输出通过管道传输到另一个命令的输入中:

    $ output_com | input_com
    

    output_com 慢于 input_com . 在我的剧本中,之前 输入com 准备好操作后,需要执行其他一些命令。

    为了加快速度,我想开始 输出com 在脚本开始时,输出到某种高容量fifo,执行其他需要执行的命令,然后执行 输入com fifo输入。类似这样:

    #!/bin/bash
    #
    mkfifo /tmp/fifo
    output_com > /tmp/fifo &
    
    somecommand1
    somecommand2
    input_com < /tmp/fifo
    

    不幸的是,FIFO的缓冲区大小对于我的用例来说太小了,所以 输出com 很快就被阻止了 输入com 开始阅读。 这些命令之间共享的数据量可以从500MB到1GB不等。

    有没有我不知道的机制、工具或概念可以允许 输出com 要开始在fifo上缓冲许多MB 输入com

    例如,如果fifo缓冲区可以由tmp文件(用作缓冲区的hdd)烘焙,那就太好了,但我还没有找到如何做到这一点。使用简单文件是非阻塞的,并且 输入com 在之前终止 输出com

    2 回复  |  直到 7 年前
        1
  •  2
  •   Draco Metallium    7 年前

    有一个工具叫做 buffer 这就像一根更大的管子。默认情况下,它不会安装在大多数发行版中,但可以从软件包管理器中安装。

    #!/bin/bash
    #
    mkfifo /tmp/fifo
    output_com | buffer -m 1024m -s 512k > /tmp/fifo &
    
    somecommand1
    somecommand2
    input_com < /tmp/fifo
    wait
    

    遗憾的是,手册没有规定 buffer

        2
  •  1
  •   user1333144    7 年前

    您是否尝试过在RAM中创建fifo文件?缓冲区大小应该不是什么问题。

    /dev/shm是一个特殊的文件夹,您写入其中的所有内容都存储在内存中,而不是硬盘中。试着看看这是否加快了速度:

    #!/bin/bash
    
    ramdisk=/dev/shm
    fifo=$ramdisk/fifo
    mkfifo $fifo
    output_com > $fifo &
    
    somecommand1
    somecommand2
    wait
    input_com < $fifo