Възможно ли е да се анализира голям xml файл с размер 800 MB с помощта на SAX Parser

Анализирам transxchange данни, които съдържат някои файлове с много голям размер почти 800 MB. когато се опитвам да анализирам тези файлове, получавам следната грешка.

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 heap space.   -  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
За останалите файлове отнема по-малко време и успешно анализира, само че получих грешка за два файла, които имат 100MB и 800MB.   -  person Ram kiran    schedule 15.05.2012
comment
Вече увеличавам размера на купчината, но без полза, отново получавам същата грешка.   -  person Ram kiran    schedule 15.05.2012


Отговори (4)


Въпрос: Възможно ли е да се анализира голям xml файл с размер 800 MB с помощта на SAX Parser?

A: Да, разбира се!

Проблемът не е в SAX. SAX всъщност е идеален избор за работа с големи файлове.

Проблемът очевидно е възникнал с вашия arraylist.

Колко голям е?

Колко големи са другите структури?

Всъщност трябва ли да съхранявате всички данни, за които отделяте място?

Изпълнявате ли програмата си с някакви VM флагове за разпределяне на повече памет?

Колко памет има компютърът ви? Можете ли да го стартирате на компютър, който поддържа повече памет? 64-битов компютър?

Използвате ли 64-битова JVM?

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

Вероятно ще откриете, че разпределяте много повече данни, отколкото сте възнамерявали.

ИМХО...

person paulsm4    schedule 15.05.2012

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

Вижте този блог.

person Cephalopod    schedule 15.05.2012

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

person digitaljoel    schedule 15.05.2012

Грешката възниква при създаването на структура от данни, която вие създавате. Трябва или да намалите колко памет използвате, или да увеличите количеството памет, което вашата програма има.

Един GB не е това в наши дни. Ако можете да му дадете от 4 до 16 GB, това ще направи обработката на файла много по-лесна.

person Peter Lawrey    schedule 15.05.2012