Создание и сохранение больших XML в Java - PullRequest
3 голосов
/ 22 ноября 2011

Я работаю над Java-приложением, задачей которого является создание и сохранение XML (большой размер).Пример, который я получил, - это 300 МБ XML-файл.

Приложение было разработано для сбора массовых данных из базы данных и сохранения их в формате XML.Приложение из-за интенсивного ввода-вывода и использования памяти было разработано для параллельной обработки MAX 3 таких запросов.

Теперь требуется, чтобы он обрабатывал до 50 таких запросов параллельно.Текущее приложение использует XMLbean для создания XML, а затем сохраняет его в файловой системе.Приложение отображается в виде веб-службы на сервере weblogic (оно работает на 64-разрядной ОС и Java MAX Heap size id 4 ГБ).

Мне нужно ваше мнение по поводу:

1) Существует ли XML API, который работает с XSD и может использоваться для создания больших XML-файлов размером 200–200 МБ с минимальными издержками?XMLbean прекрасно работает для нас, но есть ли что-то, что может справиться с этим лучше?

2) Каков наилучший и наиболее эффективный способ сохранения файла в файловой системе?- Я думаю о том, чтобы сменить текущую запись на bufferedWriter и сохранить 1024 байта в памяти, прежде чем произойдет физическая запись на диск.- Может ли быть какой-либо побочный эффект при его увеличении?

3) Если нет ограничений на выбор технологии, сервер и т. Д., - какое будет идеальное решение !!!

РЕДАКТИРОВАТЬ 1 #Доступ к БД быстрый (около 5% от общего времени).Создание XML происходит медленно (занимает 80%) времени.Сохранение занимает 15% (но я вижу, что я могу сделать много улучшений, поэтому меня это не беспокоит).- Спасибо, Луис.

Ответы [ 2 ]

5 голосов
/ 22 ноября 2011

У меня была похожая проблема.Сервер записывал данные с помощью JDOM в файлы XML.С годами эти данные становились все больше, сервер становился медленнее, а используемая память огромной.Причина этого была следующая:

Сервер накапливал данные в больших хэш-таблицах и списках.В конце задания он создал XML-документ с JDOM в памяти и записал его на диск.

Я изменил запись XML, чтобы использовать потоковый подход с XMLStreamWriter ЕдинственнымПроблема заключалась в том, что написанный XML-файл был не очень красивым.Эту проблему можно решить с помощью IndentingXMLStreamWriter

Пример кода:

FileOutputStream fileOutputStream = new FileOutputStream(outXmlFile);
XMLStreamWriter defaultWriter = factory.createXMLStreamWriter(fileOutputStream, encoding);
IndentingXMLStreamWriter writer = new IndentingXMLStreamWriter(defaultWriter);
writer.setIndentStep("  ");
try
{
    writer.writeStartDocument(encoding, "1.0");

    if (stylesheet != null)
    {
        writer.writeProcessingInstruction("xml-stylesheet", "type='text/xsl' href='" + stylesheet + "'");
        writer.writeCharacters("\n");
    }


    writer.writeStartElement(TAG_ROOT);
    writer.writeAttribute(TAG_OBJECT_TYPE, rootObject.getClass().getSimpleName());

    ...

    writer.writeEndElement();
    writer.writeEndDocument();
} 
finally
{
    writer.flush();
    writer.close();
    fileOutputStream.close();
}
4 голосов
/ 22 ноября 2011

Я хотел бы изучить использование потоковых XML-API, таких как StAX, чтобы избежать необходимости хранить весь XML-документ в памяти перед его записью на диск. Таким образом, объем памяти можно сохранить на низком уровне (не нужно в 50 раз превышать размер XML для параллельной обработки 50 документов) ...

См. Почему StAX? (Oracle) для получения дополнительной информации.

...