Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / dom4j OutOfMemoryError / 2 сообщений из 2, страница 1 из 1
06.08.2012, 18:16:33
    #37906187
Lihman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dom4j OutOfMemoryError
Доброго %Времени_Суток%!

Есть задачка: прочитать БОЛЬШОЙ xml-файл
Написал простенький код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
    public static void main(String[] argv) throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read("xml/201111.xml");
        List<? extends Node> rows = document.selectNodes("/*[name()='Workbook']/*[name()='Worksheet']/*[name()='Table']/*[name()='Row']");
        for (Node row : rows)
        {
            System.out.println("id:" + ((DefaultElement) row).elements().get(0).element("Data").getText());
        }
    }



И вроде как все прекрасно работает, но !!!
Файл размером около 400М

Пробовал играться с
Код: java
1.
-Xms512m -Xmx1024m


Не помогает
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at org.dom4j.tree.LazyList.addElement(LazyList.java:161)
	at org.dom4j.tree.LazyList.add(LazyList.java:31)
	at org.dom4j.tree.DefaultElement.addNewNode(DefaultElement.java:503)
	at org.dom4j.tree.AbstractElement.addNode(AbstractElement.java:1386)
	at org.dom4j.tree.AbstractElement.add(AbstractElement.java:859)
	at org.dom4j.tree.AbstractBranch.addElement(AbstractBranch.java:157)
	at org.dom4j.io.SAXContentHandler.startElement(SAXContentHandler.java:280)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:506)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:376)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2715)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568)
	at org.dom4j.io.SAXReader.read(SAXReader.java:439)
	at org.dom4j.io.SAXReader.read(SAXReader.java:317)
	at Nov2011.main(Nov2011.java:16)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)



Может можно как-то по другому зачитать файл?
Например частями (блоками по 1М), но как тогда скормить это SAXReader?

Или может использовать не dom4j ?

Заранее спасибо за любые советы!
...
Рейтинг: 0 / 0
06.08.2012, 18:24:26
    #37906202
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dom4j OutOfMemoryError
DOM парсеры строят из XML дерево объектов. При этом каждый объект ещё содержит целые строки из входящего XML. Поэтому 400Мб файл легко разрастается в 800Мб+ строковых летералов и ещё сотни Мб объектов.
Для обработки файлов такого размера использовать можно SAX или StAX.

Выбор конретного решения сильно зависит от того что вам нужно получить в итоге.
Если нужно просто конвертировать в объекты, то я использую Digester. Он основан на SAX и имеет простой и невероятсно гибкий механизм маппинга.
Если нужно гонять туда и обратно, нужно попробовать JAXB. Но с ним, возможно, ещё придется похимичить.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / dom4j OutOfMemoryError / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]