2012-06-20 6 views
12

utilizo los dos aspectos siguientes, pero no funciona para gran data..of 12 mbDescarga de datos de texto de 12 mb desde la URL y guardar en la tarjeta SD ... Se produce un problema de memoria en el montón. ¿alguna solución?

char[] chars = new char[1024]; 
int len; 
while((len=buffer.read(chars))>0) { 
    data.append(chars,0,len); 
} 

y

while ((line = reader.readLine()) != null) { 
    sb.append(line + "\n"); 
} 
+0

Estoy analizando xml ... necesito todo xml en una sola cadena ... si lo almacené en una tarjeta sd, entonces también tengo que leerlo en una cadena que también requiere más memoria de montón ... el resultado es un error ... –

Respuesta

-1

Tuve el mismo problema y utilizo este, Debería dividir el archivo xml si es posible y luego tratar de leer ese archivo en cadena y analizarlo.

+0

Gracias, esto también me parece una buena idea. . :) –

+0

¿Puede explicar a quién pretende analizar parte de XML? No será válido por lo que sé. –

1

Probablemente debería intentar asignar toda la 12mb en la memoria y luego comprobar si el la asignación tiene éxito. A continuación, cargue los datos en el búfer.

O, si puede cargar el archivo en partes y procesarlo, debería ser eficiente de esta manera.

2

¿Por qué no leer su XML en trozos y guardar cada fragmento en la tarjeta SD? El único problema en esta solución es que necesita algún tipo de analizador de flujo XML mediante el cual puede cargar dinámicamente partes de su XML y analizarlas.

Puede ser que pueda usar Streaming API para XML, llamado StaX, y escribir flujo de entrada personalizado para este caso. Algunos ejemplos http://www.vogella.com/articles/JavaXML/article.html#javastax

8

Guarde los datos en trozos en la tarjeta SD. Luego, utilizando una función de XmlPullParser, se puede analizar el archivo guardado anteriormente de la siguiente manera de Android:

  1. abierto un flujo de entrada en el archivo que acaba de descargar
  2. Utilice el método setInput(InputStream inputStream, String inputEncoding)
  3. Diviértete mientras se analizaba este enorme archivo XML.
2
  1. Crear instancia XmlPullParser
  2. llamada XmlPullParser.setInput con su entrada (ya sea Reader o InputStream); ese es el dato que descarga (por Socket u otro medio)
  3. Use las funciones de XmlPullParser para analizar su archivo de texto xml.

Nota: necesita hacer esto en un hilo no principal, puede llevar mucho tiempo descargar el archivo. (De todos modos, no puedes hacer una tarea de red en el hilo de UI). Esto debería ser eficiente con la memoria, XmlPullParser no almacena en caché los datos en la memoria. No es necesario almacenar el archivo en la tarjeta SD primero.

También observe errores: tiempos de espera de conexión, errores en xml, etc. Trate su trabajo como un éxito cuando el analizador informe que llegó al final del documento.

3

de lectura en partes de 1 MB de datos & uso SAXParser para analizar

1

¿Es necesario analizar toda secuencia XML y crear una enorme objeto DOM, o va a analizar trozos hacen?

Si DEBE analizar XML completo, lo único que puede hacer es obtener más memoria y sistema operativo de 64 bits.
De lo contrario, use el analizador SAX o StAX para obtener y analizar los fragmentos directamente de la transmisión o después de guardarlos localmente.

1

Según lo indicado por el usuario, recomendaría descargar trozo por fragmento y no todo el archivo a la vez, porque si lo haces en la banda de rodadura principal puede ralentizar toda tu aplicación, hazlo con asynctask y hazlo pedazo por pedazo. Aparte de eso, puedo recomendar alguna publicación sobre el tema.

-En this posterior se puede encontrar un enlace a un artículo sobre how to use SAX

-En this uno puede encontrar otro SAX and DOM tutorial

espero que estos dos artículos pueden ayudar logras lo que necesitas O si ambos artículos fallan con su problema, entonces puede tratar de encontrar una mejor manera de organizar su XML, siempre hay una mejor manera de hacerlo, solo necesita pensar un poco más.

ACTUALIZACIÓN:

-Este otro post sobre STAX puede ser útil, porque es una API de Streaming para procesamiento de XML, por lo que puede ser el mejor para su caso.

+0

Por qué no tratar de reabrir tu pregunta, es mejor que comiences a buscar otras preguntas similares, o vuelvas a hacer tu pregunta para que sea más legible, porque incluso si se abre, no veo un futuro brillante para ella. PERO tal vez este puede ayudarlo [PUBLICAR ACERCA DE CARTOONIFICAR] (http://stackoverflow.com/questions/1357403/how-to-cartoon-ify-an-image-programmatically) –

Cuestiones relacionadas