Java XML-парсер без чрезмерного выделения памяти - PullRequest
1 голос
/ 15 июля 2010

На работе я анализирую большие XML-файлы, используя класс DefaultHandler. Делая это, я заметил, что этот интерфейс выделяет много String s для имен элементов, имен и значений атрибутов и т. Д.

Исходя из этого, я подумал о создании парсера 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 используют много памяти. Это действительно просто часть синтаксического анализа, которую я хочу эффективно использовать в памяти. Все остальное просто для простого примера.

1 Ответ

1 голос
/ 15 июля 2010

«Создание объектов дорого не было правдой» в течение достаточно долгого времени в Java.Распределение обычно очень дешево (переместите указатель), и сборка мусора прошла долгий путь.

Я бы определенно использовал бы API-интерфейс XML, который позволяет вам делать то, что вы хотите, а не беспокоиться слишкоммного о чрезмерном распределении памяти, если только вы не думаете, что будете раздвигать границы производительности.

Я уверен, что - это API-интерфейсы XML, предназначенные для того, чтобы занимать особенно мало места в памяти - нонасколько велики ваши XML-файлы?Если они достаточно малы, чтобы легко помещаться в память, я бы не стал беспокоиться об этом ... и если они слишком велики для этого, вам все равно нужно подумать о потоковом API.Я подозреваю, что диапазон размеров, в котором особенно эффективный парсер может уместить его в памяти, но «нормальный» не может быть относительно небольшим с точки зрения применимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...