在bash脚本中,我使用以下命令将命令输出传递给另一个命令的输入:
$ output_com | input_com
output_com
比input_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_com
在output_com
开始读取之前开始缓冲fifo上的许多MB?
例如,如果fifo缓冲区可以由tmp文件(用作缓冲区的hdd)烘焙,那将是很好的,但我还没有找到如何做到这一点。使用简单文件是非阻止的,并使input_com
在input_com
完成之前终止。
答案 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