【问题标题】:High capacity buffer fifo or use of a file as buffer for a fifo大容量缓冲区fifo或使用文件作为fifo的缓冲区
【发布时间】:2017-10-31 16:04:26
【问题描述】:

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

$ output_com | input_com

output_cominput_com 慢。在我的脚本中,在input_com 准备好运行之前,还需要执行一些其他命令。

为了加快速度,我想在脚本的开头开始output_com,输出到某种高容量的fifo,做其他需要完成的命令然后用fifo执行input_com在输入。像这样的:

#!/bin/bash
#
mkfifo /tmp/fifo
output_com > /tmp/fifo &

somecommand1
somecommand2
input_com < /tmp/fifo

不幸的是,fifos 的缓冲区大小对于我的用例来说太小了,所以output_cominput_com 开始读取之前很快就被阻塞了。 这些到命令之间共享的数据量可以从 500MB 到大约 1GB 不等。

是否有一些我不知道的机制、工具或概念可以让output_cominput_com 开始读取之前开始缓冲fifo 上的许多MB?

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

【问题讨论】:

    标签: linux bash pipe fifo


    【解决方案1】:

    有一个名为buffer 的工具可以像一根更大的管道一样工作。大多数发行版默认不安装它,但可以从包管理器中安装。

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

    遗憾的是,手册没有指定buffer 可以使用的最大块数,也没有指定缓冲区的最大大小,但这应该会给你一个 1GiB 的缓冲区。

    【讨论】:

    • 谢谢你,这就是我想要的。
    【解决方案2】:

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

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

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

    【讨论】:

    • 嗨,我不认为 FIFO 的缓冲区大小取决于创建 FIFO 的文件系统类型,但具有固定大小(在内核上设置?)。在pipe(7) 上写着“自 Linux 2.6.11 起,管道的容量为 65536 字节”(翻译自法语手册页)。
    猜你喜欢
    • 2013-01-05
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 2012-09-04
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    相关资源
    最近更新 更多