android - java8 - java base64 encoding
un único carácter en Base64String contiene cuántos bytes? 1, 2 o más (1)
Vamos a empezar desde el principio...
Base64 es un formato de codificación basado en un conjunto de 64 caracteres; cada carácter vale 6 bits de datos (2 ^ 6 = 64). Por lo tanto, al convertir, cada byte de 8 bits de entrada necesita (8/6) = 1.333333 ... caracteres.
Pero como las computadoras solo almacenan bytes enteros, es más fácil decir que por cada 3 bytes (3 * 8 = 24 bits) de entrada, se generan 4 caracteres base-64 (4 * 6 = 24 bits).
Ahora, dices que la longitud total de tu base 64 es de 11 millones de caracteres. En Java, las cadenas se almacenan en formato Unicode de 16 bits: 1 carácter = 2 bytes.
Entonces, 11 millones de caracteres usarán más de 20 MB solo en los datos de carácter sin procesar. Eso, combinado con objetos, variables y otros estados necesarios para almacenar la información significa que 26 MB es un valor razonable para la cantidad de datos que está utilizando.
Por lo tanto, una regla general que puede utilizar para estimar el uso de memoria es (((input_data_in_bytes * 4/3) * 2) + unos pocos MB)
En mi aplicación Android, el requisito es obtener las imágenes del servidor y almacenarlas en caché en la memoria Heap.
Al recibir la solicitud, el servidor primero codifica el byte[]
en Base64String
y devuelve esa cadena. Y, en el momento de convertirlo en ImageView
la aplicación de Android decodifica el Base64String
nuevo en el byte[]
, crea un Bitmap
y lo coloca en ImageView
.
Como todo está en caché, hay posibilidades de que la Aplicación se quede sin memoria en algún momento y se bloquee de manera crítica.
Para evitar la situación de falta de memoria, he definido un quantum de seguridad (por ejemplo, 5 MB) en mi aplicación. Si en algún momento la memoria disponible está por debajo de este quantum de seguridad , el usuario debería marcar algunas de las imágenes como los candidatos que se eliminarán. Junto con, la aplicación mostraría que la memoria estimada se liberará una vez que se borren los elementos seleccionados.
El Bitmap
se ha reciclado una vez que el usuario se aleja de la imagen, por lo que el Bitmap
no contiene memoria mientras estamos lejos.
En una prueba en particular, descargo 55 imágenes, y mi capacidad aumenta de 16 MB
a 42 MB
. Eso significa que 55 imágenes ocupan 26 MB
. Después de borrarlos a todos, el montón se reduce a 16 MB
.
Pero, cuando tomo una suma acumulativa de longitudes de todo Base64String
, llega al 11983840
. Y si considero un carácter como 1 byte
los 11983840 bytes
hacen 11.4 MB
El problema es que la suma acumulada de las longitudes de Base64String
es la única medida disponible para mí, que ayuda a que el usuario sepa cuánta memoria puede liberar su selección.
También he leído la siguiente pregunta, que menciona, por cada 3 Bytes
de datos originales, el Base64String
tendrá 4 Characters
.
La pregunta es, ¿un solo carácter en Base64String
contiene cuántos bytes? 1, 2 o más
Si 1 character
es de 1 byte
, y en mi prueba, el montón crece y se reduce en 26 MB . Entonces, ¿por qué la suma acumulada de las longitudes de Base64String
es solo de 11.4 MB ?
Actualizado
Esto significa 1 Byte
por personaje.
El CharacterSet predeterminado aquí es UTF-8