Разбор (очень) больших файлов XML с помощью XmlSlurper

Я новичок в Groovy, и я пытаюсь прочитать (довольно) большой файл XML (более 1 ГБ) с помощью XmlSlurper, который должен творить чудеса с большими файлами из-за того, что он не строит весь DOM в памяти.

Тем не менее, я продолжаю получать «OutOfMemoryError: пространство кучи Java», что заставляет меня думать, что, очевидно, я что-то делаю неправильно. Я попытался увеличить параметр Xmx, но предпочел бы решить проблему, поскольку впоследствии мне, возможно, придется иметь дело с еще большими файлами.

Вот строка кода, которую я использовал:

def posts = new XmlSlurper().parse(new File("posts.xml"))

Любой намек на то, что не так?

Заранее спасибо,

Джереми.


person Jérémie Clos    schedule 02.04.2012    source источник
comment
Этот вопрос аналогичен: stackoverflow.com/questions/4104264/   -  person Lari Hotari    schedule 11.02.2016


Ответы (2)


Groovy XmlSlurper — это анализатор SAX, но он загружает в память всю модель...

Чтобы избежать исключений OOM, вам, вероятно, потребуется либо увеличить объем памяти (как вы говорите, используя настройку -Xmx), либо вы можете напишите свой собственный синтаксический анализатор SAX, чтобы получить из документа только те данные, которые вам нужны

person tim_yates    schedule 02.04.2012
comment
Что ж, это объясняет. Спасибо ! - person Jérémie Clos; 02.04.2012

Я немного опоздал на эту вечеринку, но у меня тоже была такая же проблема.

Я сделал предложение в список рассылки groovy-user, фактически предложив добавить в XmlSlurper что-то похожее на perl-модуль XML::Twig.

def xpathSlurper = new XPathXmlSlurper2();    
def c = { twig, it ->      
    println it.text().trim();
    twig.purgeCurrent();
}
xpathSlurper.setTwigRootHandler(xpath, c);
def fdata = xpathSlurper.parse(new File("test.xml")); 

Я прикрепил пример кода здесь: http://groovy.329449.n5.nabble.com/first-step-toward-Xml-Twig-for-Groovy-groovy-util-XPathXmlSlurper2-groovy-td4923577.html< /а>

Надеюсь, это поможет!

person jprobichaud    schedule 05.04.2012
comment
Прямо сейчас я решил свою проблему, написав свой собственный анализатор SAX, как предложил tim_yates, но, поскольку в будущем мне придется иметь дело с аналогичными (и, возможно, большими) объемами данных, я был бы рад иметь что-то подобное. Спасибо, что указали на это! - person Jérémie Clos; 12.04.2012