Сохранение данных в XML файл

Рейтинг: -1Ответов: 1Опубликовано: 21.03.2023

Пишу программу, которая сохраняет услуги и случаи пациентов в XML файл. Услуг каждый раз разное количество примерно от 60 до 100 тыс.

Есть входной список объектов zapis, который содержит в себе объект patient и список sluchai. А каждый объект sluchai содержит список услуг uslugi.

Общая схема связи следующая:

Zapis
  Pacient
  List<Sluchai>

Sluchai
  List<Uslugi>

Сейчас запись в XML файл происходит следующим образом:

public void createXML(List<Zapis> Zapiss) {
    List<Zapis> zapisList = Zapiss;

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder;
    try {
        builder = factory.newDocumentBuilder();

        Document document = builder.newDocument();

        Element zagolovok = document.createElementNS("", "zagolovok");

        Zglv zglv = new Zglv("1", "1.0", "XML");

        zagolovok.appendChild(getZglv(document, zglv));

        document.appendChild(zagolovok);

        for (Zapis zapis : zapisList) {

            zagolovok.appendChild(getZapis(document, Zapis));
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            DOMSource source = new DOMSource(document);

            StreamResult file = new StreamResult(new File("C:/tmp/xml.xml"));
            transformer.transform(source, file);
        }
    } catch (TransformerException transformerException) {
        transformerException.printStackTrace();
        transformerException.getMessageAndLocation();
    } catch (ParserConfigurationException parserConfigurationException) {
        parserConfigurationException.getStackTrace();
        parserConfigurationException.printStackTrace();
    }
}

Привожу только метод, где происходит запись в файл. Также есть методы getSluchai, getUslugi, getPacient, которые вызываются друг в друге, они большие, чтобы не засорять вопрос не привожу

Проблема в том, что запись в xml файл всех этих данных происходит очень долго. Этот метод выполнялся больше двух часов, пока я не прервала. В предыдущий раз выдал ошибку

java.lang.OutOfMemoryError Error

Сама структура xml в итоге выглядит так:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<zagolovok>
    <zglv>
        ***
    </zglv>
    <zapis>
        <pacient>
            ***
        </pacient>
        <sluchai>
            ***
            <uslugi>
                ***
            </uslugi>
            <uslugi>
                ***
            </uslugi>
        </sluchai>
    </zapis>
    <zapis>
        <pacient>
            ***
        </pacient>
        <sluchai>
            ***
            <uslugi>
                ***
            </uslugi>
        </sluchai>
    </zapis>
    ***
</zagolovok>

Есть ли другой способ записи данных в XML? Не понимаю почему так долго.

Ответы

▲ 1Принят
  1. У вас достаточно большое количество записей и вы используете DOM. Это означает, что все данные должны быть загружены и сформированы в объекты. Лечится выделением JVM достаточно (большого) объема памяти. Не избавляет от долгой обработки.

  2. Кроме DOM, есть еще вариант SAX/StAX, который позволяет обрабатывать и записывать элементы последовательно. Тогда вы сможете читать данные постранично и сразу записывать их. Но при этом будет больше "лишних" оберток и файл может записаться не до конца. Пример работы StAX можно узреть тут https://mkyong.com/java/how-to-write-xml-file-in-java-stax-writer/