Otros han sugerido leer y procesar partes de su archivo a la vez. Si es posible, una de esas formas sería mejor.
Sin embargo, si esto no es posible y puede cargar el String
inicialmente en la memoria como lo indica pero es más tarde el análisis de esta cadena que crea problemas, es posible que pueda utilizar subcadenas. En Java, una subcadena se correlaciona con la matriz original char
y solo toma la memoria para la base Object
y luego los punteros int de inicio y de longitud.
Por lo tanto, cuando se encuentra una porción de la cadena que desea mantener por separado, usar algo como:
String piece = largeString.substring(foundStart, foundEnd);
Si en lugar de esto o código que internamente hace esto, entonces el uso de memoria aumentará dramáticamente :
new String(largeString.substring(foundStart, foundEnd));
Tenga en cuenta que debe utilizar String.substring()
con cuidado por esta misma razón. Puede tener una secuencia muy grande de la cual toma una subcadena y luego descarta su referencia a la cadena original. El problema es que la subcadena todavía hace referencia a la gran matriz original char
. El GC no lo lanzará hasta que la subcadena también se elimine. En casos como este, es útil usar realmente new String(...)
para asegurar que la matriz grande no utilizada será descartada por el GC (este es uno de los pocos casos donde debe usar new String(...)
).
Otra técnica, si espera tener muchas cuerdas pequeñas y estas tienen los mismos valores, pero vienen de una fuente externa (como un archivo), es usar .intern()
después de crear la nueva cadena.
Nota: Esto depende de la implementación de String
que realmente no debería tenerse en cuenta, pero en la práctica para aplicaciones grandes a veces tiene que confiar en ese conocimiento. Tenga en cuenta que las versiones futuras de Java pueden cambiar esto (aunque no es probable).
¿No puedes analizar el archivo bit a bit con uno de los lectores (por ejemplo, BufferedReader)? –