У меня есть большой (1,9 ГБ) XML-файл, в котором есть данные, которые я хочу вставлять в базу данных MySQL каждый месяц.Я сделал для этого сценарий Ant.
Задача Ant XSLT не может обработать один файл такого большого размера, поэтому у меня есть задача, использующая xml_split (из xml-twig-tools), чтобы разделить XML-файл размером 1,9 ГБ на небольшие XML-файлы размером примерно 4 МБ.
Все идет хорошо.
Я использую следующий Ant xml для запуска задачи XSLT над всеми этими XML-файлами:
<target name="xsltransform" depends="split" description="Transform XML to SQL...">
<xslt basedir="${import.dir}/"
destdir="${import.dir}/sql/"
style="${xsl.filename}" force="true">
<mapper type="glob" from="*.xml" to="*.sql" />
<factory name="net.sf.saxon.TransformerFactoryImpl"/>
</xslt>
</target>
Проблема в том, что в ближайшее времякогда он начинается с первого XML-файла, я вижу, что память 'RES' в linux top растет с каждым следующим XML-файлом.Поскольку он обрабатывает несколько (не связанных) XML-файлов, я подозреваю, что это освободит память между переводами каждого XML-файла.Ну, это не так ... после двухсот 4MB xml-файлов java выдает исключение нехватки памяти:
BUILD FAILED
/var/lib/hudson/jobs/EPDB_Rebuild_Monthly/workspace/trunk/buildfiles/buildMonthly.xml:67: java.lang.OutOfMemoryError: Java heap space
at net.sf.saxon.tinytree.TinyTree.ensureNodeCapacity(Unknown Source)
at net.sf.saxon.tinytree.TinyTree.addNode(Unknown Source)
at net.sf.saxon.tinytree.TinyBuilder.startElement(Unknown Source)
at net.sf.saxon.event.Stripper.startElement(Unknown Source)
at net.sf.saxon.event.ReceivingContentHandler.startElement(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at net.sf.saxon.event.Sender.sendSAXSource(Unknown Source)
at net.sf.saxon.event.Sender.send(Unknown Source)
at net.sf.saxon.event.Sender.send(Unknown Source)
at net.sf.saxon.Controller.transform(Unknown Source)
at org.apache.tools.ant.taskdefs.optional.TraXLiaison.transform(TraXLiaison.java:194)
at org.apache.tools.ant.taskdefs.XSLTProcess.process(XSLTProcess.java:812)
at org.apache.tools.ant.taskdefs.XSLTProcess.execute(XSLTProcess.java:408)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:390)
at org.apache.tools.ant.Target.performTasks(Target.java:411)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1360)
at org.apache.tools.ant.Project.executeTarget(Project.java:1329)
Есть ли что-то, что я могу сделать, чтобы задача XSLT не сожрала всемои воспоминания?Или я должен пересмотреть свой подход?