Foros del Web » Programación para mayores de 30 ;) » Java »

Almacenar cadena xml de más de 5 MB

Estas en el tema de Almacenar cadena xml de más de 5 MB en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 10/11/2009, 17:51
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 1 mes
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
  #2 (permalink)  
Antiguo 10/11/2009, 21:27
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 1 mes
Puntos: 9
Respuesta: Almacenar cadena xml de más de 5 MB

Cambiando el tamaño del heap pude solucionarlo. Ni siquiera necesito leerlo por bloques al buffer, llamando al método toString() del mismo ya funciona.

Saludos!.
__________________
Add, never Remove
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:26.