【问题标题】:Optimal way to pipe many files to Gnu Parallel将许多文件传输到 Gnu Parallel 的最佳方式
【发布时间】:2018-10-02 20:25:52
【问题描述】:

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

我正在从内容包含在许多文件中的存档中解析数据。目标是为整个档案按类型将不同的数据类型解析为文件。为此,我将文件连接在一起并将它们传送到每个解析命令。解析器接受标准输入上的数据,并将要解析的数据类型作为参数(例如“解析器 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'

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

【问题讨论】:

    标签: parallel-processing pipe


    【解决方案1】:

    这有点复杂,但它避免了多次读取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 设置简单得多。

    管道/fifos 速度非常快(>2 GB/s),您可以通过它们传输的数据量没有限制。他们避免数据进入磁盘。

    【讨论】:

    • 就是这样,我想用不同的参数向解析器发送相同的输入。我省略了显式命令,因为我已经完成了创建要执行的完整命令列表的工作(在考虑使用并行之前)。我不知何故错过了 --tee 选项,并且一定误解了手册页中关于 --pipe 的警告。谢谢。
    • 我可以看到,--pipe 中的限制在使用--tee 时不适用,这并不是很清楚。
    猜你喜欢
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 2010-10-11
    相关资源
    最近更新 更多