Ver Mensaje Individual
  #1 (permalink)  
Antiguo 10/11/2009, 17:51
mariano_donati
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 20 años
Puntos: 9
Almacenar cadena xml de más de 5 MB

Hola,

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
  1. public String toString()
  2.     {
  3.         final int MB = 1048576;
  4.         StringBuilder xml = new StringBuilder();
  5.        
  6.         try
  7.         {
  8.             TransformerFactory tFactory = TransformerFactory.newInstance();
  9.             Transformer transformer = tFactory.newTransformer();
  10.  
  11.             DOMSource source = new DOMSource(xmldoc);
  12.             StringWriter writer = new StringWriter();            
  13.             transformer.transform(source, new StreamResult(writer));
  14.  
  15.             // COMIENZA LECTURA POR BLOQUE DEL XML ALMACENADO EN EL BUFFER
  16.             int buffersize;
  17.             int endindex;
  18.             int startindex;
  19.             StringBuffer buffer;
  20.  
  21.             buffer = writer.getBuffer();
  22.             buffersize = buffer.length();
  23.  
  24.             startindex = 0;
  25.             endindex = buffersize % MB;
  26.             while(endindex <= buffersize)
  27.             {
  28.                 xml.append(buffer.substring(startindex, endindex));
  29.                 startindex = endindex;
  30.                 endindex += MB;
  31.             }
  32.         }
  33.         catch(Exception e){}
  34.        
  35.         return xml.toString();
  36.     }

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!.
__________________
Add, never Remove