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.
- ¿Cuál es la diferencia entre esto y Actividad?
- Adición de fragmentos a un diseño
- Android - Establecer Layout_Gravity de forma programática para LinearLayout
- ¿Hacer saltar un sprite cuando el usuario teclea en la pantalla?
- Texto de recorte de Facebook en Android cuando se usa una intención de ACTION_SEND
// 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.
- Dentro del código de Android, ¿qué sugiere las características que un programa espera de una variable?
- ¿Cómo leer un archivo de texto del directorio "assets" como una cadena?
- intento androide no activar
- Aplicación de Android Crashing después de salir presionando "botón Atrás"
- Dibujo sobre lienzo y varios objetos de pintura
- Mantener el estado de la aplicación android utilizando alwaysRetainTaskState y lauchMode
- Android FileInputStream leer () archivo txt a String
- ¿Existe y es equivalente a la clase Point pero para los puntos 3D?
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 notificar de la actividad B a A que los datos de la lista se han cambiado?
- ModelCache.computeIfAbsent no debe ser nulo