将许多文件管道传输到 Gnu 并行的最佳方法



当输入数据包含在许多文件中时,我需要一些帮助来优化 gnu 并行,这些文件必须连接在一起并管道化成几个不同的命令,每个命令都要并行运行。

我正在解析存档中的数据,该存档的内容包含在许多文件中。目标是将不同的数据类型按类型解析为整个存档的文件。为此,我将文件连接在一起,并将它们通过管道传输到每个解析命令。解析器接受 stdin 上的数据,并将要解析的数据类型作为参数(例如,"解析器 type1"来解析 type1 的数据等(

目前我有这样的东西:

parallel --xapply :::  
'cat datadir/*.dat | parser type1 > type1.txt'  
'cat datadir/*.dat | parser type2 > type2.txt'  
'cat datadir/*.dat | parser type3 > type3.txt'

但这需要多次连接数据,这很慢,而且似乎不必要的成本很高。另外,我的理解是管道上有吞吐量限制。有没有更好的方法来实现这一目标?

这有点复杂,但它避免了多次读取datadir/*.dat,它使用 fifos 而不是临时文件。

# Example parser
parser() { cat | grep "$@"; }
# Make function visible to GNU Parallel
export -f parser
types="type1 type2 type3"
# Create fifos: myfifo-type1 myfifo-type2 myfifo-type3
parallel mkfifo myfifo-{} ::: $types
# Send datadir/*.dat to 'parser type1', 'parser type2', 'parser type3'
# send output to myfifo-type1 myfifo-type2 myfifo-type3
cat datadir/*.dat |
parallel -j0 --pipe --tee parser {} '>' myfifo-{} ::: $types &
# Read from the fifos
parallel --xapply echo :::: myfifo*
rm myfifo*

有点不清楚你想要在最后--xapply什么命令.也许您正在寻找的只是将相同的输入发送到具有不同参数的parser

cat datadir/*.dat |
parallel -j0 --pipe --tee parser {} '>' output-{} ::: $types

这比上面的mkfifo设置简单得多。

管道/FIFO非常快(>2 GB/s(,并且您可以通过它们放置的数据量没有限制。他们避免数据进入磁盘。

最新更新