Android – OutOfMemory al leer el archivo de texto

Estoy haciendo una aplicación de diccionario en android. Durante su inicio, la aplicación cargará el contenido del archivo .index (~ 2MB, 100.000+ líneas)

Sin embargo, cuando utilizo BufferedReader.readLine () y hago algo con la cadena devuelta, la aplicación causará OutOfMemory.

// Read file snippet Set<String> indexes = new HashSet<String)(); FileInputStream is = new FileInputStream(indexPath); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String readLine; while ( (readLine = reader.readLine()) != null) { indexes.add(extractHeadWord(readLine)); } // And the extractHeadWord method private String extractHeadWord(String string) { String[] splitted = string.split("\\t"); return splitted[0]; } 

Al leer el registro, encontré que mientras que ejecutaba, hace que el GC limpia explícitamente los objetos muchas veces (GC_EXPLICIT liberó xxx objetos, en el cual xxx es un número grande tal como 15000, 20000).

Y lo intenté de otra manera:

 final int BUFFER = 50; char[] readChar = new char[BUFFER]; //.. construct BufferedReader while (reader.read(readChar) != -1) { indexes.add(new String(readChar)); readChar = new char[BUFFER]; } 

..y corre muy rápido. Pero no era exactamente lo que quería.

¿Hay alguna solución que se ejecute rápido como el segundo fragmento y fácil de usar como el primero?

Considerar.

El método extractHeadWord utiliza el método String.split . Este método no crea nuevas cadenas, sino que se basa en la cadena subyacente (en su caso, el objeto de line ) y utiliza índices para señalar la "nueva" cadena.

Puesto que usted no está interesado en el resto de la cuerda usted necesita descartarla así que consigue la basura recogida de otra manera la cadena entera estará en memoria (solamente usted está utilizando solamente una parte de ella).

Llamar al constructor String(String) ("copy constructor") descarta el resto de la cadena:

 private String extractHeadWord(String string) { String[] splitted = string.split("\\t"); return new String(splitted[0]); } 

¿Qué sucede si tu extractHeadWord hace esto return new String(splitted[0]); .

No reducirá objetos temporales, pero podría reducir la huella de la aplicación. No sé si split hace lo mismo que substring, pero supongo que sí. Substring crea una nueva vista sobre los datos originales, lo que significa que la matriz de caracteres completa se mantendrá en la memoria. La invocación explícita de una new String(string) truncará los datos.

  • Cómo quitar caracteres no válidos de una cadena?
  • El método getString (int) no está definido para el tipo Apps
  • HttpURLConnection de Android lanza EOFException en solicitudes HEAD
  • ¿Cómo aprender un marco sin tutoriales
  • Programaticamente Salir de la aplicación Android Sin terminar ()
  • Nombres de los parámetros del método build-preserve de Gradle release
  • Eclipse deja de resaltar las referencias después de un tiempo
  • Formato Flotación a n decimales
  • ¿Necesita una comprensión "completa" de Java para programar aplicaciones de Android?
  • Firebase - Tratando de recuperar datos de cada usuario en una lista
  • Reaccionar-despliegue nativo al error del dispositivo android 3 clase de actividad no existe
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.