Ojalá que codifica una cadena de toma menos memoria?

faraz:

Estoy confundido sobre el tema espacio de memoria. Digamos que tenemos una cadena siguiente:

String from = "Hello I am from Chicago";

Si codificarla utilizando la codificación de Huffman, LZ4, o GZip, etc. (el algoritmo de codificación no importa en este punto):

String encodedFrom= encodingLibrary.encode(from);

Ahora, la cantidad de espacio de memoria encodedNamese sostendría, sería menos de lo que namehabría tomado?

Estoy confundido porque, cuando estamos almacenando cadenas, incluso si hay menos bits, VM (o sistema operativo en sí, o algo así) se agregan el relleno hasta el final para terminar el byte. Algo como eso. Así que al final del día, el tamaño de la memoria (no el consumo) es el mismo tanto para codificar y ONU codificados con cuerdas. Estoy en lo cierto al pensar que?

Segunda pregunta relacionada con la primera, que en realidad quiere codificar 100s de miles de registros y almacenarlo en la memoria caché Redis. ¿cuál sería el juego a cabo, si excluimos el tiempo que le toma a compresión / descompresión y de consumo de memoria factores? cadena codificada podría ocupar menos espacio en la memoria caché Redis?

Agradecería cualquier ayuda.

Roland Illig:

Comprimir una cadena y luego almacenar la parte posterior resultado comprimido en otra cadena es una muy mala idea.

Strings, por convención, son secuencias de caracteres. Se supone que deben contener letras, puntuacion, espacios en blanco y cosas similares. El que descubre que los utiliza para almacenar datos binarios será enojado con usted ya que es muy inusual.

Si alguna vez desea comprimir cadenas, ser lo más honesto posible y almacenar los datos comprimidos en una matriz de bytes. Las matrices de bytes son contenedores universales, y el almacenamiento de datos arbitrarios en ellos es de esperar.

Volviendo a su pregunta principal. En Java, una Stringes básicamente una char[], lo que significa que cada personaje consume 16 bits (por lo que se trata de Inglés simple u otros personajes del avión multilingüe básico ).

Puesto que todos los caracteres ASCII son, cada uno de ellos pueden ser codificados utilizando 7 bits. Añadir otro poco en la parte frontal diciendo "el resto de esta cadena es de sólo ASCII", usted termina con un esquema y la compresión simple 1 + 23 * 7bits, lo que equivale a 21 bytes. Sin duda, en este caso hay 6 bits de relleno en el último byte, pero en comparación con los 2 * 23bytes para almacenar la cadena como está, que ya está bien.

(Me olvidó: Desde Java 9, cadenas ASCII solamente se almacenan de una manera especial que utiliza sólo 8 bits por carácter en lugar de 16. Por lo tanto el esquema de compresión propuse anterior sólo serán eficaces hasta Java 8.)

Al utilizar Redis para almacenamiento de datos, tenga en cuenta que se mantiene todos los datos en la memoria RAM y se bloquea una vez que no puede asignar más memoria RAM. (Por lo que yo recuerdo, eso es desde hace unos 5 años.) Por lo tanto, si ya se puede estimar los datos Redis que se hacen más grandes que unos pocos gigabytes, mejor elegir otra biblioteca de almacenamiento de datos.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=205446&siteId=1
Recomendado
Clasificación