bugfix> bash > 投稿

XMLファイルでいっぱいのディレクトリを取得し、XSLTを介してCSVにそれらを実行し、すべての変換を単一のファイルに結合するbashコマンドがあります。私は 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 件
  • 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
    
    

    これにより、 parallel が生成されます  CPUコアごと。そのため、すべてのCPUの100%CPU使用率または100%ディスクI/Oが表示されるはずです。ファイルがキャッシュされている場合、100%のCPU使用率が表示されるはずです。ただし、その多くはGNU Parallelによるものです。

あなたの答え