高容量缓冲区 fifo 或使用文件作为 fifo 的缓冲区
High capacity buffer fifo or use of a file as buffer for a fifo
在 bash 脚本中,我使用以下命令将命令的输出通过管道传输到另一个命令的输入:
$ output_com | input_com
output_com
比 input_com
慢。在我的脚本中,在input_com
准备运行之前,还需要执行一些其他命令。
为了加快速度,我想在脚本的开头开始output_com
,输出到某种高容量的fifo,做其他需要完成的命令然后执行input_com
与输入的 fifo。像这样:
#!/bin/bash
#
mkfifo /tmp/fifo
output_com > /tmp/fifo &
somecommand1
somecommand2
input_com < /tmp/fifo
不幸的是,fifos 的缓冲区大小对于我的用例来说太小了,所以 output_com
在 input_com
开始读取之前很快就被阻塞了。
这些命令之间共享的数据量大约从 500MB 到 1GB 不等。
是否有某种我不知道的机制、工具或概念可以允许 output_com
在 input_com
开始读取之前开始缓冲 fifo 上的许多 MB?
例如,如果 fifo 缓冲区可以由 tmp 文件(hdd 用作缓冲区)烘焙,那就太好了,但我还没有找到如何做到这一点。使用简单的文件是非阻塞的,并使 input_com
在 output_com
完成之前终止。
您是否尝试过在 RAM 中创建 fifo 文件?缓冲区大小应该不是什么大问题。
/dev/shm 是一个特殊的文件夹,您写入其中的所有内容都会存储在内存中而不是硬盘中。试试看这是否会加快速度:
#!/bin/bash
ramdisk=/dev/shm
fifo=$ramdisk/fifo
mkfifo $fifo
output_com > $fifo &
somecommand1
somecommand2
wait
input_com < $fifo
有一个名为 buffer 的工具,它的工作原理类似于更大的管道。它在大多数发行版中没有默认安装,但可以从包管理器中安装。
#!/bin/bash
#
mkfifo /tmp/fifo
output_com | buffer -m 1024m -s 512k > /tmp/fifo &
somecommand1
somecommand2
input_com < /tmp/fifo
wait
遗憾的是,手册没有指定 buffer
可以使用的最大块数,也没有指定缓冲区的最大大小,但这应该给你一个 1GiB 的缓冲区。
在 bash 脚本中,我使用以下命令将命令的输出通过管道传输到另一个命令的输入:
$ output_com | input_com
output_com
比 input_com
慢。在我的脚本中,在input_com
准备运行之前,还需要执行一些其他命令。
为了加快速度,我想在脚本的开头开始output_com
,输出到某种高容量的fifo,做其他需要完成的命令然后执行input_com
与输入的 fifo。像这样:
#!/bin/bash
#
mkfifo /tmp/fifo
output_com > /tmp/fifo &
somecommand1
somecommand2
input_com < /tmp/fifo
不幸的是,fifos 的缓冲区大小对于我的用例来说太小了,所以 output_com
在 input_com
开始读取之前很快就被阻塞了。
这些命令之间共享的数据量大约从 500MB 到 1GB 不等。
是否有某种我不知道的机制、工具或概念可以允许 output_com
在 input_com
开始读取之前开始缓冲 fifo 上的许多 MB?
例如,如果 fifo 缓冲区可以由 tmp 文件(hdd 用作缓冲区)烘焙,那就太好了,但我还没有找到如何做到这一点。使用简单的文件是非阻塞的,并使 input_com
在 output_com
完成之前终止。
您是否尝试过在 RAM 中创建 fifo 文件?缓冲区大小应该不是什么大问题。
/dev/shm 是一个特殊的文件夹,您写入其中的所有内容都会存储在内存中而不是硬盘中。试试看这是否会加快速度:
#!/bin/bash
ramdisk=/dev/shm
fifo=$ramdisk/fifo
mkfifo $fifo
output_com > $fifo &
somecommand1
somecommand2
wait
input_com < $fifo
有一个名为 buffer 的工具,它的工作原理类似于更大的管道。它在大多数发行版中没有默认安装,但可以从包管理器中安装。
#!/bin/bash
#
mkfifo /tmp/fifo
output_com | buffer -m 1024m -s 512k > /tmp/fifo &
somecommand1
somecommand2
input_com < /tmp/fifo
wait
遗憾的是,手册没有指定 buffer
可以使用的最大块数,也没有指定缓冲区的最大大小,但这应该给你一个 1GiB 的缓冲区。