que java8 encodetostring and android character-encoding base64 heap-memory android-memory

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 .

Cálculo de longitud Base64?

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