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

时间:2017-10-31 16:04:26

标签: linux bash pipe fifo

在bash脚本中,我使用以下命令将命令输出传递给另一个命令的输入:

$ output_com | input_com

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

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

input_com

不幸的是,fifos的缓冲区大小对于我的用例来说太小了,所以#!/bin/bash # mkfifo /tmp/fifo output_com > /tmp/fifo & somecommand1 somecommand2 input_com < /tmp/fifo output_com开始读取之前被快速阻止。 这些命令之间共享的数据量大约在500MB到1GB之间。

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

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

2 个答案:

答案 0 :(得分:2)

有一个名为buffer的工具就像一个更大的管道。默认情况下,它不会安装在大多数发行版中,但可以从包管理器安装。

#!/bin/bash
#
mkfifo /tmp/fifo
output_com | buffer -m 1024m -s 512k > /tmp/fifo &

somecommand1
somecommand2
input_com < /tmp/fifo
wait

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

答案 1 :(得分:0)

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

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

#!/bin/bash

ramdisk=/dev/shm
fifo=$ramdisk/fifo
mkfifo $fifo
output_com > $fifo &

somecommand1
somecommand2
wait
input_com < $fifo