執行最多500個XML文件轉換的最有效(性能明智)和乾淨的方式是什麼?每個Mb並從它們中取出一個單獨的字符串。所有文件都是XML,需要保持格式化等。將大量XML(文件對象)轉換爲包含所有文件內容的單個字符串
我目前正在使用XMLEventReader進行讀取,然後使用XMLEventWriter,一次讀取一個事件,並使用StringBuilder連接所有字符串結果。 然後在方法結尾將它變成一個字符串,但是由於IDE中缺少Java堆空間而導致崩潰,在500個文件之前...
謝謝!
執行最多500個XML文件轉換的最有效(性能明智)和乾淨的方式是什麼?每個Mb並從它們中取出一個單獨的字符串。所有文件都是XML,需要保持格式化等。將大量XML(文件對象)轉換爲包含所有文件內容的單個字符串
我目前正在使用XMLEventReader進行讀取,然後使用XMLEventWriter,一次讀取一個事件,並使用StringBuilder連接所有字符串結果。 然後在方法結尾將它變成一個字符串,但是由於IDE中缺少Java堆空間而導致崩潰,在500個文件之前...
謝謝!
此String對象的大小可達50 GB(50 MB * 500 * 2)。你知道的,是嗎?
當您在討論輸入文件並且想要將序列化的xml數據保存在字符串中時,您不必解析這些文件,只需將文件內容附加到您的StringBuilder即可。
假設,所有的文件都在一個文件夾中,並與公共-IO的一點幫助,這應該這樣做(...不是我的機器有4 GB的RAM上,順便說一句):
File[] files = parentFolder.list();
StringBuilder veryVeryBigBuilder = new StringBuilder();
for (File file: files) {
if (isXmlFile(file)) {
veryVeryBigBuilder.append(FileUtils.readFileToString(), encoding);
}
}
數學看起來可怕:),謝謝。爲什麼* 2 BTW? – akapulko2020 2010-09-16 11:30:41
你的意思是我應該只讀文件(如字節[]?)並追加到StringBuilder中? – akapulko2020 2010-09-16 11:31:09
Java中的char由16位表示,String由char []表示。 – 2010-09-16 11:32:41
你真的需要打擾他們是XML嗎?難道你不能依次使用BufferedReader
逐行讀取每個文件,只需將所有行輸出到PrintWriter
?
我需要保留它們的XML,因爲缺少更好的單詞 - 因爲這是調用者方法期望的內容...我將檢查您建議的方法並查看它是否適用於此案例。 – akapulko2020 2010-09-16 11:29:56
請注意,生成的連接文件將不會是有效的XML,因爲它不會有單個根節點。然而,你很可能會使用像XML這樣的大文件;解析它幾乎肯定會讓你失去內存。 – Qwerky 2010-09-16 11:47:56
是的,這確實是調用方法提供的錯誤響應。因爲它確實解析爲XML .. :( – akapulko2020 2010-09-16 13:04:36
什麼你以後使用了字符串嗎?如果可能跳過這個中間字符串,也許有更高性能的方式。 – 2010-09-16 12:12:42
沒有辦法改變輸出格式,因爲它被一些類似於「客戶端庫」的東西所使用,它不能被改變。儘管謝謝! – akapulko2020 2010-09-16 14:40:06