Распаковка больших XML-файлов в Java - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь разобрать большие XML-файлы размером около 6 Гб в объект Java.Ниже приведена реализация, которую я использовал для анализа большого файла.Работает только с 20Gb кучи.Я хотел бы еще больше уменьшить объем отпечатка памяти.

XMLInputFactory xif = XMLInputFactory.newInstance();
XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("abc.xml"));
xsr.nextTag();
long addEntity = 0;
long unmarshalEntity = 0;

JAXBContext jc = JAXBContext.newInstance(XYZ.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
while(xsr.nextTag() == XMLStreamConstants.START_ELEMENT) {
    long start1 = System.currentTimeMillis();
    XYZ sample = (XYZ) unmarshaller.unmarshal(xsr);
}

Он продолжает выдавать.У меня 3,3 миллиона объектов XYZ, если я анализирую весь файл.Итак, есть ли способ удержать эти объекты в памяти, поскольку мне нужно выполнить некоторую постобработку этих объектов, поскольку постобработка зависит от нескольких объектов XYZ.

1 Ответ

0 голосов
/ 28 мая 2018

При анализе все данные для XML будут преобразованы в иерархию классов Java, которая окажется в памяти.

Чтобы избежать проблем с памятью для больших файлов, вы можете:

  • Непосредственно используйте SAX-парсер, который управляется событиями и почти не использует память.
  • Используйте частичный демонтаж с JAXB

Это наложит некоторые ограничения на то, как вы можете обрабатыватьДанные XML, поскольку они никогда не будут доступны сразу.Если постобработка происходит в некоторых фрагментах XML разумного размера, это не проблема, поскольку вы можете сделать это в памяти.Если постобработка должна происходить по всему XML, одним из вариантов будет загрузить данные в базу данных и выполнить там постобработку.

...