没有过多内存分配的Java XML解析器

时间:2010-07-14 22:02:33

标签: java xml parsing memory-management

在工作中,我使用DefaultHandler类解析大型XML文件。这样做,我注意到这个接口为元素名称,属性名称和值等分配了许多String个。

由此,我考虑创建一个只执行绝对最小对象分配的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正在使用大量内存。它实际上只是我想要内存效率的解析部分。其他一切只是为了做一个简单的例子。

1 个答案:

答案 0 :(得分:1)

“在Java中相当长的一段时间内,对象创建的成本并不昂贵”。分配通常很便宜(移动指针),垃圾收集已经走了很长的路。

肯定使用XML API,它可以让你轻松地做你想做的事情,而不是担心过多的内存分配,除非你认为你将会推动你的性能界限。 / p>

我确定 XML API旨在让内存占用空间特别小 - 但是你的XML文件有多大?如果它们足够小,可以很容易地融入内存,我就不用担心了......如果它们太大了,你真的需要考虑一个流API。我怀疑在一个特别有效的解析器可以适应内存的大小带,但在适用性方面,“普通”解析器不能相对较小。