2017-03-31 57 views
0

我必須每次在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%)。

爲了把它概括地說,這裏是所有的意見/接近我到目前爲止有:

  1. 拆分子文件夾中的整個XML文件(例如包含每個 5K文件),並使用此作爲一種並行轉換腳本與collection()功能運行每個子文件夾
  2. 使用專門的Saxon-EE library(允許 多線程執行)來解析XML文件
  3. 套裝Java環境具有較低的任務數,或降低 每個進程
  4. 指定撒克遜關於如果XSLT張是兼容的內存 libxml/libxslt(是不是隻爲XSLT1.0?)
  5. 使用一個專門的外殼如xmlsh

我可以處理解決方案#2,它應該直接啓用來控制循環並只加載JVM一次; #1似乎更笨拙,我仍然需要改進Bash(載荷分佈& perf,處理相對/絕對路徑); #3,#4和#5對我來說是全新的,我可能需要更多的解釋來了解如何解決這個問題。

任何輸入將不勝感激。

+0

這是不難做到的XSLT轉換在Java和具有相同JVM變換數以千計的文件,你可以得到編譯XSLT文件只有一次的利益,並利用執行人來以受控的方式並行處理它們。這需要相當一些編碼,而且「X分開組」可能會更簡單。 –

回答

0

「最有效的方式」是要求很多,而且通常不是一個合理的目標。例如,我懷疑你準備投入6個月的時間來提高過程效率3%。您正在尋找的是一種符合績效目標的方法,並且可以以最小的努力來實施。而「效率」本身就引發了關於你的指標是什麼的問題。

我非常有信心,我提出的設計,使用collection()和xsl:result-document(它們都在Saxon-EE中並行化)處理所有文件的單個轉換能夠給出良好的結果,並且可能比我考慮的唯一其他方法要少很多,那就是編寫一個Java應用程序來保存「控制邏輯」:儘管如果你擅長編寫多線程Java應用程序,那麼你可以通過利用你對工作負載的知識,可能會讓它變得更快一些。

+0

正如你所說的,使用EE版本應該是非常有幫助的,非常感謝。但是,編寫Java應用程序不屬於我的技能組合,所以我會通過。但是,只要服務器完成第一次運行,我就會嘗試你的方法。對於我可能無法遵循的最終效率改進方法而言,你是對的,但我仍然希望在堅實的基礎上建立自己的知識,而不是爲了獲得我最終沒有真正掌握的東西。 –

0

嘗試從libxslt使用xsltproc command line tool。它可以將多個xml文件作爲參數。要這樣調用它,你需要先創建一個輸出目錄。嘗試調用它像這樣:

mkdir output 
xsltproc -o output/ some-xslt-sheet.xsl input/*.xml 
+0

感謝你們,我也會對它進行測試,並比較各種表現。 –

相關問題