我有一个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
这似乎很简单,我不知道我错过了什么。有人可以提出建议吗?
答案 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。