【问题标题】:Why is GNU parallel as slow as single-CPU xargs for this command?为什么这个命令的 GNU 并行和单 CPU xargs 一样慢?
【发布时间】:2018-11-04 06:17:01
【问题描述】:

我有一个 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

这看起来很简单,我不知道我错过了什么。谁能给个建议?

【问题讨论】:

  • xml文件的大小是多少?也许瓶颈是磁盘操作?
  • 有 17698 个 XML 文件,文件大小中位数为 53947 字节。不知道这怎么可能是真的,因为 xargs 并行在 30 秒内完成。

标签: bash parallel-processing xargs gnu-parallel


【解决方案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。

【讨论】:

  • 第一个跑4秒,厉害!我无法让第二个运行,一些文件名包含空格,所以这可能是一个问题。 ``` 无法解析 - -:1: parser error : start tag expected, '
  • 所以使用 -X 也不起作用。它将文件名分成组,但只在其中一个组上运行 XSLT proc。这就是它跑得如此之快的原因。仍然没有找到使用并行的解决方案。
猜你喜欢
  • 2016-08-06
  • 2012-04-05
  • 1970-01-01
  • 2017-07-27
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多