Можно ли проанализировать большой xml-файл размером 800 МБ с помощью SAX Parser

Я анализирую данные transxchange, в которых есть файлы очень большого размера, почти 800 МБ. когда я пытаюсь проанализировать эти файлы, я получаю следующую ошибку.

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
=======================================================================
    at java.util.ArrayList.<init>(Unknown Source)
    at java.util.ArrayList.<init>(Unknown Source)
    at JourneyPatternSections.<init>(JourneyPatternSections.java:21)
    at ReadBusData.startElement(ReadBusData.java:131)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(Unknown Source)
    at ReadBusData.parseDocument(ReadBusData.java:51)
    at ReadBusData.<init>(ReadBusData.java:41)
    at ReadBusData.main(ReadBusData.java:218).

Я следую этому руководству.
Кто-нибудь может мне помочь.


person Ram kiran    schedule 15.05.2012    source источник
comment
Вопрос здесь в том, сколько времени это занимает.   -  person UVM    schedule 15.05.2012
comment
не могли бы вы помочь мне, я получаю java.lang.OutOfMemoryError: пространство кучи Java.   -  person Ram kiran    schedule 15.05.2012
comment
Это может помочь stackoverflow.com/a/4182801/945945   -  person Umer Hayat    schedule 15.05.2012
comment
Можете ли вы распечатать командную строку, которую вы используете для запуска этого приложения? Я чувствую, что проблема связана с недостаточным размером кучи. Попробуйте Xmx2g и расскажите нам, что происходит   -  person Chander Shivdasani    schedule 15.05.2012
comment
Для остальных файлов это занимает меньше времени и успешно анализируется, только я получил ошибку для двух файлов размером 100 МБ и 800 МБ.   -  person Ram kiran    schedule 15.05.2012
comment
Я уже увеличиваю размер кучи, но бесполезно, снова получаю ту же ошибку.   -  person Ram kiran    schedule 15.05.2012


Ответы (4)


В: Можно ли разобрать большой xml-файл размером 800 МБ с помощью SAX Parser?

О: Да, конечно!

Проблема не в SAX. SAX на самом деле является идеальным выбором для работы с большими файлами.

Проблема явно возникла с вашим массивом.

Насколько оно большое?

Насколько велики другие структуры?

Действительно ли вам нужно хранить все данные, для которых вы выделяете место?

Вы запускаете свою программу с какими-либо флагами VM, чтобы выделить больше памяти?

Сколько памяти у вашего ПК? Можете ли вы запустить его на ПК, который поддерживает больше памяти? 64-битный ПК?

Вы используете 64-битную JVM?

ПРЕДЛОЖЕНИЕ: Загрузите и попробуйте Visual VM, чтобы устранить проблему на уровне вашего кода:

Вероятно, вы обнаружите, что выделяете гораздо больше данных, чем планировали.

ПО МОЕМУ МНЕНИЮ...

person paulsm4    schedule 15.05.2012

Увеличьте размер кучи, например, запустите виртуальную машину с -Xmx1g.

см. этот блог.

person Cephalopod    schedule 15.05.2012

SAX будет вашим лучшим механизмом для разбора большого файла. Анализ DOM загрузит весь документ в память, и вы столкнетесь с проблемами. Скорее всего, у вас возникли проблемы, потому что вы пытаетесь сохранить все в какой-то коллекции. SAX отлично подходит для разбора xml, работы с ним и движения дальше.

person digitaljoel    schedule 15.05.2012

Ошибка возникает при создании структуры данных, которую создает вы. Вам нужно либо уменьшить объем используемой памяти, либо увеличить объем памяти, который имеет ваша программа.

Один Гб - это не то, что в наши дни. Если вы можете дать ему от 4 до 16 ГБ, это значительно упростит обработку файла.

person Peter Lawrey    schedule 15.05.2012