当输入数据包含在许多文件中时,我需要一些优化gnu并行的帮助,这些文件必须串联在一起并通过管道传递到几个不同的命令中,每个命令都可以并行运行。
我正在从档案中解析数据,该档案的内容包含在许多文件中。目标是将整个存档按类型将不同的数据类型解析为文件。为此,我将文件串联在一起,并将它们通过管道传递给每个解析命令。解析器接受stdin上的数据,并将要解析的数据类型作为参数(例如,“ parser 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'
但是,这需要多次连接数据,这很慢并且似乎不必要。另外,我的理解是管道上有吞吐量限制。有没有更好的方法来实现这一目标?
答案 0 :(得分:0)
这有点复杂,但是它避免了多次读取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
设置简单得多。
Pipes / fifos的速度非常快(> 2 GB / s),并且可以通过它们放置的数据量没有限制。他们避免数据曾经碰到磁盘。