为什么GNU并行与此命令的单CPU xargs一样慢?

时间:2018-05-24 22:42:33

标签: bash parallel-processing xargs gnu-parallel

我有一个bash命令,它接受一个充满XML文件的目录,通过XSLT将它们运行到CSV,并将所有转换组合成一个文件。我一直在尝试使用parallel,但此命令的CPU使用率从未超过100%。我无法使用xargs,因为输出会散布。

这需要约30秒,但同样,输出穿插: find /path/to/xml -type f -iname '*.xml' -print0 | xargs -0 -P8 xsltproc transform.xsl > out.txt

这需要约90秒。单核。 find /path/to/xml -type f -iname '*.xml' -print0 | xargs -0 xsltproc transform.xsl > out.txt

这也需要约90秒。与单核一样慢,top的CPU使用率从未高于100%。 find /path/to/xml -type f -iname '*.xml' -print0 | parallel -0 xsltproc transform.xsl > out.txt

这似乎很简单,我不知道我错过了什么。有人可以提出建议吗?

1 个答案:

答案 0 :(得分:1)

GNU Parallel每个作业的开销大约为5毫秒。因此,如果你的工作是短暂的,那么这个开销将是限制因素。

xsltproc可以将多个文件作为参数,因此这可能有所帮助:

find /path/to/xml -type f -iname '*.xml' -print0 |
  parallel -X -0 xsltproc transform.xsl > out.txt

修改

如果这样做是正确的:

find /path/to/xml -type f -iname '*.xml' -print0 |
  xargs -0 -P8 xsltproc transform.xsl > out.txt

(混合输出除外),-X解决方案也必须做正确的事情。 xargs -P8解决方案会在transform.xsl之后放置许多文件名。 -X的情况也是如此。你确定xargs -P8的输出是完整的(虽然是混合的)输出吗?

如果xlstproc仅对单个文件名有效,请尝试以下方法:

find /path/to/xml -type f -iname '*.xml' |
  parallel --pipe -N100 --round-robin parallel xsltproc transform.xsl > out.txt

这会产生每个cpu核心parallel。因此,您现在应该看到所有CPU的100%CPU使用率或100%磁盘I / O.如果文件被缓存,那么你应该看到100%的CPU使用率 - 其中很多来自GNU Parallel。