将许多文件传输到Gnu Parallel的最佳方式

时间:2018-10-02 20:25:53

标签: parallel-processing pipe

当输入数据包含在许多文件中时,我需要一些优化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'

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

1 个答案:

答案 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),并且可以通过它们放置的数据量没有限制。他们避免数据曾经碰到磁盘。