GNU Parallel |管道命令

时间:2016-09-06 14:55:30

标签: linux greenplum gnu-parallel

我是使用 GNU parallel的新手,我在使用 GNU parallel运行以下命令时需要您的建议:

/home/admin/Gfinal/decoder/decdr.pl --gh --w14b /data/tmp/KRX12/a.bin | 
perl  /home/admin/decout/decoder/flow.pl >> /data/tmp/decodedgfile/out_1.txt

我将在文件列表(.bin)上运行此命令,那么使用 GNU parallel实现该目标的最佳(最快)方法是什么?命令的第一部分(/home/admin/Gfinal/decoder/decdr.pl --gh --w14b)的输出非常大(> 2 GB)。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:3)

这会起作用吗?

parallel /home/admin/Gfinal/decoder/decdr.pl --gh --w14b {} '|' perl  /home/admin/decout/decoder/flow.pl >> /data/tmp/decodedgfile/out_1.txt ::: /data/tmp/KRX12/*.bin

(如果flow.pl的输出超过I / O可以处理的磁盘,请尝试parallel --compress)。

或者也许:

parallel /home/admin/Gfinal/decoder/decdr.pl --gh --w14b {} '|' perl  /home/admin/decout/decoder/flow.pl '>>' /data/tmp/decodedgfile/out_{#}.txt ::: /data/tmp/KRX12/*.bin

这取决于您是想要单个输出文件还是每个输入文件一个。

还花一个小时浏览教程。你的命令行会爱你。 man parallel_tutorial

答案 1 :(得分:0)

以下是gnu-parallel / parallel

的精彩视频

参考youtube Part 1: GNU Parallel script processing and execution

以下是GNU网站上有​​关平台特定信息的链接。

参考gnu parallel download information

  

"多个输入源

     

GNU parallel可以在命令行中获取多个输入源。 GNU   parallel然后生成输入源的所有组合:

     

parallel echo ::: A B C ::: D E F

     

输出(顺序可能不同):

     

A D

     

A E

     

A F

     

B D

     

B E.    ............

     

输入源可以是文件:

parallel -a abc-file -a def-file echo"

参考GNU-Parallel-Tutorial

参考管道

  

管道容量          管道的容量有限。如果管道已满,则写入(2)          将阻塞或失败,具体取决于是否设置了O_NONBLOCK标志          (见下文)。不同的实现具有不同的限制          管道容量。应用程序不应该依赖于特定的          容量:应该设计一个应用程序,以便进行阅读过程          一旦可用就会消耗数据,以便进行写入过程          不会被阻止。

  In Linux versions before 2.6.11, the capacity of a pipe was the same
   as the system page size (e.g., 4096 bytes on i386).  Since Linux
   2.6.11, the pipe capacity is 65536 bytes.  Since Linux 2.6.35, the
   default pipe capacity is 65536 bytes, but the capacity can be queried
   and set using the fcntl(2) F_GETPIPE_SZ and F_SETPIPE_SZ operations.
   See fcntl(2) for more information.
     

PIPE_BUF          POSIX.1表示写入(2)s必须小于PIPE_BUF字节          atomic:输出数据作为连续内容写入管道          序列。超过PIPE_BUF字节的写入可能是非原子的:          内核可以将数据与其他进程写入的数据交错。          POSIX.1要求PIPE_BUF至少为512字节。 (在Linux上,          PIPE_BUF是4096字节。)精确的语义取决于是否          文件描述符是非阻塞的(O_NONBLOCK),是否存在          管道的多个写入器,以及n,要的字节数          写成:

参考man7.org pipe

您可以查看 fcntl F_GETPIPE_SZ和F_SETPIPE_SZ操作以获取更多信息。

参考fcntl

一切顺利