Necesito almacenar una cadena xml que tiene más de 5 MB y puede llegar a tener hasta 7 MB.
Almaceno en un StringBuffer el contenido xml. No puedo extraer desde éste toda la cadena, sino que debo ir leyendola por bloque, sino me lanza una excepción OutOfMemory. La leo por bloques de 1 MB. Aunque la excepción se lanza cuando lees más de 5 MB.
El problema surge cuando quiero almacenarla en una variable String. Lo mismo pasa cuando la agrego a un StringBuilder. En ambos casos, la excepción se lanza cuando intento almacenar el tercer mega del buffer.
Este es el código:
Código java:
Ver original
{ final int MB = 1048576; StringBuilder xml = new StringBuilder(); try { TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer(); DOMSource source = new DOMSource(xmldoc); transformer.transform(source, new StreamResult(writer)); // COMIENZA LECTURA POR BLOQUE DEL XML ALMACENADO EN EL BUFFER int buffersize; int endindex; int startindex; StringBuffer buffer; buffer = writer.getBuffer(); buffersize = buffer.length(); startindex = 0; endindex = buffersize % MB; while(endindex <= buffersize) { xml.append(buffer.substring(startindex, endindex)); startindex = endindex; endindex += MB; } } return xml.toString(); }
Este es el mensaje de error que me lanza y la salida del stack:
Exception in thread "Thread-1" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2882)
at java.lang.AbstractStringBuilder.expandCapacity(Abs tractStringBuilder.java:100)
at java.lang.AbstractStringBuilder.append(AbstractStr ingBuilder.java:390)
at java.lang.StringBuilder.append(StringBuilder.java: 119)
at Xml.XmlStringBuilder.toString(XmlStringBuilder.jav a:107)
at Parser.Processor.ProcessFile(Processor.java:117)
at Parser.Processor.run(Processor.java:58)
¿Alquien se tuvo que enfrentar con esta limitación en algún momento? ¿Cómo lo solucionaron?
Saludos!.