Bash 为什么这个命令的GNU并行速度和单CPU xargs一样慢?

Bash 为什么这个命令的GNU并行速度和单CPU xargs一样慢?,bash,parallel-processing,xargs,gnu-parallel,Bash,Parallel Processing,Xargs,Gnu Parallel,我有一个bash命令,它获取一个充满XML文件的目录,通过XSLT到CSV运行它们,并将所有转换组合成一个文件。我一直尝试使用并行,但是这个命令的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-

我有一个bash命令,它获取一个充满XML文件的目录,通过XSLT到CSV运行它们,并将所有转换组合成一个文件。我一直尝试使用
并行
,但是这个命令的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


这看起来非常简单,我不知道我错过了什么。有人能提供一个建议吗?

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核心产生一个
并行
。因此,您现在应该看到所有CPU的100%CPU使用率或100%磁盘I/O。如果文件是缓存的,那么您应该看到100%的CPU使用率-但其中很多都来自GNU并行。

xml文件的大小是多少?可能瓶颈是磁盘操作?有17698个XML文件,文件大小中值为53947字节。但不确定这是怎么回事,因为xargs parallel在30秒内完成。第一个在4秒内运行,太棒了!我无法运行第二个文件,一些文件名包含空格,因此可能是个问题无法解析---:1:parser错误:应为Start标记,'因此使用-X也不起作用。它将文件名拆分为多个组,但仅在其中一个组上运行XSLT proc。这就是为什么它跑得这么快。当时还没有找到使用并行的解决方案。