2010-07-14 48 views
1

在工作中,我使用DefaultHandler類解析大型XML文件。這樣做,我注意到這個接口爲元素名稱,屬性名稱和值等分配了許多String沒有過多內存分配的Java XML解析器

從那以後,我開始考慮創建一個只分析絕對最小值的XML解析器。目前,我需要:

  • 一個StringBuilder的建築元素名,屬性名等
  • 一個CharsetDecoder轉化成字節字符。

我的測試程序,用於解析http://magnatune.com/info/song_info.xml,看起來是這樣的:

import java.io.BufferedInputStream; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.ArrayList; 
import java.util.LinkedHashMap; 
import java.util.List; 
import java.util.Map; 

public class XmlParserDemo { 
    public static void main(String[] args) throws IOException { 
    List<Map<String, String>> allSongs = new ArrayList<Map<String, String>>(); 

    InputStream fis = new FileInputStream("d:/song_info.xml"); 
    try { 
     XmlParser parser = new XmlParser(new BufferedInputStream(fis)); 
     if (parser.element("AllSongs")) { 
     while (parser.element("Track")) { 
      Map<String, String> track = new LinkedHashMap<String, String>(); 
      while (parser.element()) { 
      String name = parser.getElementName(); 
      String value = parser.text(); 
      track.put(name, value); 
      parser.endElement(); 
      } 
      allSongs.add(track); 
      parser.endElement(); 
     } 
     parser.endElement(); 
     } 
    } finally { 
     fis.close(); 
    } 
    } 
} 

此代碼看起來比我的實驗與XMLEventReader更好。現在唯一缺少的部分是上面代碼中提到的XmlParser類。你知道如果有人曾經寫過這些代碼嗎?這真的只是我的一個寵物項目,但我很好奇多少舊的陳述對象創建是昂貴的是值得了。

是的,我知道LinkedHashMap s正在使用很多內存。這真的只是我想要的內存效率的解析部分。其他一切只是爲了舉一個簡單的例子。

+0

你想解決什麼問題?性能差,解析器使用太多的內存,還是別的?如果是性能/內存使用,首先需要進行配置文件明智的選擇,然後花費時間在預測上編寫新的解析器,以便對象分配非常昂貴。 – mdma 2010-07-14 22:16:58

+0

我真的沒有問題,它更像是一個謎題。我想看看我能夠避免內存分配。這並不是說我現在需要它,但也許以後,當我真的需要它時,我可以使用我在這裏學到的東西。 – 2010-07-15 05:14:43

回答

1

在Java中相當長一段時間內,「對象創建昂貴並非如此」。分配通常很便宜(移動指針),垃圾收集已經走了很長的路。

我會絕對使用一個XML API,它可以讓你輕鬆地做你想做的事,而不用擔心太多的內存分配過多,除非你認爲你會推動你的性能邊界。

我確定那裏有 XML APIs被設計爲具有特別小的內存佔用 - 但是你的XML文件有多大?如果它們足夠小,可以輕鬆地放入內存中,我就不用擔心它了。如果它們太大,那麼您確實需要考慮流API。我懷疑一個特別高效的解析器能夠適應內存的尺寸範圍,但在適用性方面,「正常」解析器的尺寸相對較小。

+1

你說服了我。我閱讀了關於StAX的文章(位於http://java.sun.com/performance/reference/whitepapers/StAX-1_0.pdf)並嘗試了它,只要我不調用任何不必要的方法,它就像內存有效,因爲我可以想要它。 – 2010-07-25 07:24:22