Introducción
El funcionamiento de un computador depende muchas piezas de hardware para realizar su trabajo, como lo son: el procesador, la fuente de poder, tarjeta de video, memoria RAM, disco duro, tarjeta madre, tarjeta de red, interfaz de audio y muchas más. Cada una de estas piezas cuenta con unas especificaciones particulares las cuales brindan servicios específicos al momento de encender y trabajar con nuestro computador.
En este caso estaremos revisando los sistemas de almacenamiento necesarios para que un computador funcione y nos permitan realizar tareas de análisis de datos de manera óptima, entre los cuales están la memoria Caché, la memoria ROM (Read-Only Memory), la memoria RAM (Random Access Memory) y el almacenamiento secundario.
Una vez entendiendo estas estructuras y su funcionamiento básico, buscaremos entender qué es el procesamiento in-memory y sus implicaciones en los temas de analítica.
Tipos de memoria
Por definición una memoria es todo dispositivo cuya tarea principal es almacenar datos para ser consultados por tareas o procesos externos.
Memoria Caché
Esta es una memoria volátil, es decir, todo lo que haya sido almacenado en ella será borrado en el momento en que el computador pierda su suministro de energía. Esta memoria es usada directamente por el procesador y es la que le permite almacenar los datos y tareas que deben ser accedidas de manera rápida para la ejecución de sus procesos. Su gran ventaja es la velocidad de respuesta y sus grandes desventajas son su alto costo de adquisición en adición a la poca cantidad de datos que pueden ser almacenados en ella y que no permite ser incrementada en el tiempo.
Estas son las especificaciones de un procesadore Intel Core i7 de 14 generación, en las que podemos ver que su velocidad es de 5.4 Ghz y su Caché es de 28MB:
Memoria ROM (Read-Only Memory)
Esta es una memoria permanente y tiene a variar muy poco en el tiempo, es decir, en este tipo de memoria se guardan configuraciones vitales que no sean modificadas constantemente para su uso, como lo puede ser la BIOS, el firmware, entre otros. En nuestro caso particular de análisis de datos, esta memoria no nos impacta salvo por las configuraciones que tengan y las cuales son dictadas por el fabricante.
Memoria RAM (Random Access Memory)
Esta es una memoria volátil que utiliza el computador para cargar y procesar todo el software que utilicemos en él, desde el sistema operativo hasta software de procesamiento de imágenes, sistemas de almacenamiento de datos, software de programación y todo aquello que nos permite interactuar y aprovechar sus capacidades de cómputo. Antiguamente, antes de los años 90s, este tipo de memoria solía tener poca capacidad y un alto costo, sin embargo, hoy en día estas limitantes han disminuido considerablemente y dependemos más del espacio físico y las configuraciones de nuestras máquinas para poder incrementar su tamaño.
Estas son las especificaciones de una memoria RAM Crucial DDR4 de 32 GB (2 x 16GB)
Como podemos ver, la capacidad de almacenamiento es miles de veces mayor comparada con la memoria Caché, sin embargo, su velocidad de también es miles de veces mas lenta.
Memoria Secundaria
Esta es la memoria más común, pues es la que utilizamos cotidianamente para almacenar todos los datos, archivos, imágenes, video y demás. Entre ellos están las tarjetas de memoria (SD, microSD, etc), memoria USB/Flash, unidades de disco óptico (CD, DVD, Blu-Ray), almacenamiento en la nube, disco duro (HDD) y unidad de estado sólido (SSD). Estos son los tipos de memoria con la mayor cantidad de almacenamiento del mercado en comparación a lo invertido.
Utilizaremos las especificaciones de un SSD Kingston KC2500 1TB ya que es la que presenta las mejores en comparación a los otros tipos de memoria secundaria.
Como podemos ver, si comparamos la capacidad de almacenamiento del SSD con una RAM podemos decir que es miles de veces mayor y hasta más, sin embargo, su velocidad también es miles de veces más lenta.

Procesamiento in-memory
El procesamiento in-memory se refiere a la capacidad que tiene Qlik Sense / Qlikview para cargar los datos de manera óptima, es decir, poder trabajar con mayores volúmenes de datos con espacios de memoria RAM más reducidos. En el pasado, este procesamiento se realizaba directamente sobre el disco duro, lo cual tenía sus ventajas como trabajar con volúmenes “altos” para la época (años 90s) a un costo de consultas más lenta, cómo vimos en el apartado anterior.
En un inicio, muchos fabricantes creyeron que para realizar el procesamiento in-memory sólo se debía subir los datos de la misma manera en que estaban almacenados en el disco duro, sin tener en la cuenta la gran diferencia de almacenamiento que existe entre la memoría RAM y el disco duro, causándoles una demanda excesiva de memoria RAM que los sistemas de la época no eran capaces de suplir.
Datos y almacenamiento
Los computadores son muy buenos realizando operaciones matemáticas y siguiendo instrucciones (algoritmos), sin embargo, el alfabeto en el que se comunican no es similar al que utilizamos las personas. Ellos manejan un alfabeto binario, es decir, sólo entienden ceros y unos, y con eso logran interpretar todo lo que nosotros tratamos de decirles.
Entonces, pensemos en que cada cero (0) y cada (1) tienen una unidad peso dentro de nuestras memorias a la cual llamaremos bit, es decir, el binario 0 pesa 1 bit, el binario 1 pesa 1 bit, el binario 10 pesa 2 bits, el binario 01010010 pesa 8 bits y así sucesivamente. Del mismo que el sistema métrico de medidas tiene un estándar para facilitar la interpretación de las distancias, el sistema binario también lo tiene:
Unidad | Equivalencia |
1 bit (b) | 0 o 1 |
1 Byte (B) | 8 bits (b) |
1 KiloByte (KB) | 1024 Bytes (B) |
1 MegaByte (MB) | 1024 KiloBytes (KB) |
1 GigaByte (GB) | 1024 MegaBytes (MB) |
1 TeraByte (TB) | 1024 GegaBytes (GB) |
Ya tenemos claro la manera en que un computador almacena sus datos binarios, ahora, ¿cómo interpreta un dato escrito por un humano?. Definamos que un dato es un valor numérico o una secuencia de caracteres de letras, símbolos especiales, espacios y números (más información aquí).
Empecemos revisando los datos numéricos. Estos son bastantes fáciles de entender, pues funcionan como nuestro sistema numérico decimal, que como su nombre lo dice es de base 10, a uno de base 2. Miremos el ejemplo.
Esto quiere decir que el número decimal 155 es igual al número binario 10011011 y su peso en la memoria consta de 8 bits, que a su vez es equivalente a 1 Byte.
En el caso de los caracteres, a cada letra se le asigna un número en base decimal y este se almacena como su equivalencia binaria.
Letra | # Decimal | # Binario |
a | 0 | 0 |
b | 1 | 1 |
c | 2 | 10 |
… | … | … |
x | 24 | 11000 |
y | 25 | 11001 |
z | 26 | 11010 |
De acuerdo con este ejemplo, podríamos definir un estándar para escribir con un alfabeto de minúsculas requeriría que cada letra pesara entre 1 bit y 5 bits, pero esto podría generar confusiones ya que si recibimos el binario 11010 podríamos pensar que es la letra z o podría referirse a la combinación de binarios 1 10 1 0 que equivaldría a bcba, por esta razón definimos que para nuestro estándar cada caracter debe pesar 5 bits y así ya podríamos identificar nuestro segundo caso como 00001 00010 00001 00000.
En la realidad estos estándares ya existen y utilizaremos el ASCII de 8 bits, el cual define que cada caracter tiene un peso de 1 Byte (8 Bits). Pensemos en una columna de una tabla de base de datos a la que llamaremos Color.
Color | Peso en Bytes |
ROJO | 4 Bytes |
AMARILLO | 9 Bytes |
AMARILLO | 9 Bytes |
AMARILLO | 9 Bytes |
AZUL | 4 Bytes |
ROJO | 4 Bytes |
Podemos ver que algunos colores se repiten y que cada una de esas repeticiones tiene el mismo peso que la original. Para calcular el peso de esta columna sólo debemos sumar todos sus peros.
Indexación
Una vez entendido como funciona el almacenamiento de las columnas en memoria, entremos a analizar la manera en la que Qlik cambió este paradigma, ya que en este ejemplo estamos obviando ciertas restricciones que existen en el ámbito real y que aumentan más el peso de estos valores, como lo son: tipo de dato en una base de datos (Varchar, Varchar2), la volumetría, entre otros.
La indexación es la acción de crear un índice o un identificador numérico para cada uno de los valores, de tal manera que estos puedan ser encontrados de manera más eficiente, pues ya vimos que los números son más fáciles de manejar que las cadenas de caracteres.
Qlik solucionó este problema utilizando la indexación con números binarios. Cada columna que es cargada en Qlikview, QlikSense o en sus archivos QVD, QVF o QVW, como la columna Color del caso anterior, genera una tabla maestra con los valores distintos (AMARILLO, AZUL, ROJO) y un índice binario de acuerdo con la cantidad de valores distintos.
Idx_Color | Desc_Color | Peso en Bytes |
00 | AMARILLO | 2 bits + 9 Bytes |
01 | AZUL | 2 bits + 4 Bytes |
10 | ROJO | 2 bits + 4 Bytes |
Una vez terminado este proceso, la columna original reemplaza los valores que tenía inicialmente por los nuevos índices binarios creados:
Color | Peso en Bytes |
10 | 2 bits |
00 | 2 bits |
00 | 2 bits |
00 | 2 bits |
01 | 2 bits |
10 | 2 bits |
Con estos valores calculamos el peso total de nuestra nueva columna Color de la siguiente manera:
Como podemos ver, a pesar de contar con más estructuras de datos y procesos adicionales, en este ejemplo pasamos de utilizar 312 bits en nuestro caso original a 148 bits en el caso indexado lo que significa un ahorro del 52.6% del espacio en memoria, que si lo escalamos a grandes volúmenes de datos es una mejora bastante significativa.
Conclusión
De este ejercicio podemos ver que entre más valores repetidos tenga una columna, mejor es la compresión de los datos. Del mismo modo, si todos los valores de una columna son diferentes, es muy posible que estos pesen un poco más que su fuente original.
¿Qué es procesamiento in-memory de Qlik?