毎回 1 つのフォルダー内で大量の XML ファイル (最小 100K) を (基本的には、解凍された入力データセットから) 定期的に変換する必要があり、可能な限り最も効率的な方法でそれを行う方法を学びたいと考えています。私の技術スタックは、XLT と、Bash スクリプトから呼び出される Saxon XSLT Java ライブラリで構成されています。また、8 コアの Ubuntu サーバーと 64Gb の RAM を搭載した RAID の SSD で実行されます。私は XSLT を適切に処理していますが、まだ Bash と、そのようなタスクの負荷を適切に分散する方法を学んでいる最中です (その時点では、Java もほとんど単語にすぎません)。
私のアプローチは非常に非効率的であり、実際に適切に実行するには助けが必要だったため、以前にこの問題に関する投稿を作成しました(このSOF 投稿を参照)。後で多くのコメントがありましたが、問題を別の方法で提示することは理にかなっています。したがって、この投稿. 私はいくつかの解決策を提案されました.1つは現在私よりもはるかにうまく機能していますが、それでもよりエレガントで効率的である可能性があります.
今、私はこれを実行しています:
printf -- '-s:%s\0' input/*.xml | xargs -P 600 -n 1 -0 java -jar saxon9he.jar -xsl:some-xslt-sheet.xsl
以前のいくつかのテストに基づいて、600 プロセスを設定しました。それ以上にすると、Java からメモリ エラーが発生するだけです。しかし、現在 30 ~ 40Gb の RAM しか使用していません (ただし、8 つのコアはすべて 100% です)。
一言で言えば、これまでに私が持っているすべてのアドバイス/アプローチは次のとおりです。
- XML ファイル全体をサブフォルダー (たとえば、5K ファイルごとに含む) に分割し、これを使用して、各サブフォルダーの変換スクリプトを並行して実行します。
- 特に、Saxon- EEライブラリ (マルチスレッド実行が可能) を
collection()
XML ファイルを解析する関数と共に使用します。 - タスク数の少ない Java 環境を設定するか、プロセスあたりのメモリを減らしてください。
- XSLTシートが対応しているかどうかについてSaxonを指定する
libxml/libxslt
(XSLT1.0だけじゃない?) - 次のような特殊なシェルを使用します
xmlsh
解決策 2 を処理できます。ループを制御して JVM を一度だけロードできるようにする必要があります。#1はもっと不器用に見え、Bashで改善する必要があります(負荷分散とパフォーマンス、相対/絶対パスへの取り組み); #3、#4、および#5は私にとってまったく新しいものであり、それに取り組む方法を確認するには、さらに説明が必要になる場合があります.
任意の入力をいただければ幸いです。