我必須每次在1個文件夾內(基本上是從解壓縮的輸入數據集)定期轉換大量的XML文件(最少100K),並且我想學習如何以儘可能最有效的方式做到這一點。我的技術堆棧包含XLT和從Bash腳本調用的Saxon XSLT Java庫。它運行在具有8個內核的Ubuntu服務器上,以及64Gb Ram的SSD。請記住,我很好地處理XSLT,但我仍然在學習Bash以及如何正確分配負載以執行此類任務(而Java在這一點上幾乎只是一個詞)。如何高效地並行運行大量文件的XSLT轉換?
我以前創建有關此問題的帖子,因爲我的做法顯得很低效,實際上是需要幫助的正常運行(見本SOF post)。很多評論後來,這是有道理的提出不同的問題,因此這篇文章。我提出了幾種解決方案,其中一種解決方案比我的解決方案要好得多,但它仍然可能更加優雅和高效。現在
,我運行以下命令:
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文件),並使用此作爲一種並行轉換腳本與
collection()
功能運行每個子文件夾 - 使用專門的Saxon-EE library(允許 多線程執行)來解析XML文件
- 套裝Java環境具有較低的任務數,或降低 每個進程
- 指定撒克遜關於如果XSLT張是兼容的內存
libxml/libxslt
(是不是隻爲XSLT1.0?) - 使用一個專門的外殼如
xmlsh
我可以處理解決方案#2,它應該直接啓用來控制循環並只加載JVM一次; #1似乎更笨拙,我仍然需要改進Bash(載荷分佈& perf,處理相對/絕對路徑); #3,#4和#5對我來說是全新的,我可能需要更多的解釋來了解如何解決這個問題。
任何輸入將不勝感激。
這是不難做到的XSLT轉換在Java和具有相同JVM變換數以千計的文件,你可以得到編譯XSLT文件只有一次的利益,並利用執行人來以受控的方式並行處理它們。這需要相當一些編碼,而且「X分開組」可能會更簡單。 –