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

标签 linux bash pipe fifo

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

$ output_com | input_com

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

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

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

somecommand1
somecommand2
input_com < /tmp/fifo

不幸的是,fifo 的缓冲区大小对于我的用例来说太小,因此在 input_com 开始读取之前,output_com 很快被阻止。 这些命令之间共享的数据量大约从 500MB 到 1GB 不等。

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

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

最佳答案

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

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

somecommand1
somecommand2
input_com < /tmp/fifo
wait

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

关于linux - 高容量缓冲区 fifo 或使用文件作为 fifo 缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47039755/

相关文章:

linux - 使用 perl 将文本文件中的字符替换为其他字符

linux - 杀死正在运行的 docker 容器后进行清理

linux - bash 子 shell 与 vanilla 命令执行

c - 有没有办法在运行时间方面优化这个C程序

linux - 如何创建与一天中的分钟相对应的文件?

arrays - 神秘 IFS 行为

c++ - WinAPI 等待管道读取数据

linux - "while read line"读取 C 文件时给出垃圾数据

c - 在c中使用管道在父子之间发送数据

R函数在同一列中搜索和计算多个条件?