VertiPaq para humanos: cómo Power BI comprime tus datos
TL;DR
- VertiPaq usa 3 técnicas: Value Encoding (reducir rango), Dictionary Encoding (índices), RLE (secuencias)
- Menos cardinalidad = mejor compresión (redondea decimales, limpia duplicados)
- Un solo outlier puede arruinar toda la columna
- DAX Studio + VertiPaq Analyzer para diagnosticar qué columna pesa más
VertiPaq es el motor de compresión de Power BI. Es lo que hace que puedas cargar millones de filas en memoria y que las consultas vuelen. Pero nadie te explica cómo funciona realmente.
Hoy lo arreglamos.
El problema: los bits desperdiciados
El número 22 en binario es 10110. Cinco bits.
Pero si lo guardas como entero de 32 bits, tienes 27 ceros a la izquierda que no hacen nada. Espacio desperdiciado.
Multiplica eso por millones de filas y entiendes por qué tu modelo pesa tanto.
Técnica 1: Value Encoding
Imagina una columna con valores entre 194 y 216. Para guardar 216 necesitas 8 bits (2^8 = 256).
El truco: resta el mínimo a todos los valores.
- Original: 194, 200, 216 → necesitas 8 bits
- Con offset de 194: 0, 6, 22 → necesitas 5 bits
Tres bits menos por fila. Con 10 millones de filas, eso es mucha RAM.
El problema: un solo outlier jode toda la columna. Si tienes valores del 1 al 100 pero alguien metió un 999999, toda la columna necesita más bits por culpa de ese valor.
Técnica 2: Dictionary Encoding
Tienes una columna “Color” con valores: Red, Red, White, Black, Blue, Red, Blue, Black, Black.
En vez de guardar el texto repetido, VertiPaq crea un diccionario:
| ID | Color |
|---|---|
| 0 | Red |
| 1 | White |
| 2 | Black |
| 3 | Blue |
Y la columna solo guarda: 0, 0, 1, 2, 3, 0, 3, 2, 2
Cuatro valores únicos = 2 bits por fila (2² = 4). En vez de guardar “Black” (40+ bits por string) guardas un 2 con 2 bits.
La cardinalidad importa: cuantos menos valores únicos, mejor compresión. Una columna con 4 colores comprime brutal. Una columna con 1 millón de IDs únicos no comprime nada.
Técnica 3: Run Length Encoding (RLE)
Si tus datos están ordenados:
Q1, Q1, Q1, Q1, Q1 (310 veces)
Q2, Q2, Q2, Q2, Q2 (290 veces)
En vez de 600 filas, VertiPaq guarda: (Q1, 310), (Q2, 290). Dos entradas.
El truco: solo funciona si los valores iguales están consecutivos. Si la columna está desordenada (Q1, Q2, Q1, Q2…), RLE no comprime nada.
VertiPaq decide internamente cómo ordenar para maximizar RLE. Tú no controlas esto directamente.
Qué puedes hacer tú
No controlas el algoritmo, pero sí el material que le das:
Reduce cardinalidad:
- Redondea decimales innecesarios (3.14159 → 3.14)
- Usa fecha en vez de datetime si no necesitas la hora
- Limpia duplicados (“Madrid”, “madrid”, “MADRID” → “Madrid”)
- No importes columnas que no uses
Reduce rango:
- Trata los outliers antes de importar
- Considera dividir columnas problemáticas
Usa tipos correctos:
- Números como números, no como texto
- Las claves numéricas comprimen mejor que las de texto
Modela bien:
- Las dimensiones comprimen mejor que repetir valores en la fact
- Star schema existe por algo
Columnas calculadas vs medidas
Columna calculada: se ejecuta en el refresh, se guarda físicamente, ocupa espacio.
Medida: solo guarda la fórmula, se ejecuta cuando alguien mira el visual.
Por eso “convierte columnas calculadas en medidas cuando puedas” es una regla de optimización. Mismo resultado, menos almacenamiento.
Diagnóstico
Cuando tu modelo pesa demasiado:
- DAX Studio - VertiPaq Analyzer te dice exactamente qué columna ocupa cuánto
- Busca columnas con alta cardinalidad que no deberían tenerla
- Busca columnas de texto que podrían ser IDs numéricos
- Revisa si hay columnas que no usas pero importaste “por si acaso”
Resumen
VertiPaq usa tres técnicas principales: Value Encoding (reducir rango), Dictionary Encoding (índices en vez de valores), y RLE (comprimir secuencias).
Tú no controlas el algoritmo, pero sí la calidad del material que le das. Menos cardinalidad, menos rango, tipos correctos, modelo limpio.
La diferencia entre un modelo de 2GB y uno de 200MB suele estar en decisiones que se toman antes de escribir una sola línea de DAX. Y si despues de optimizar todo nadie mira tu dashboard, al menos no ocupara tanto espacio.
Bonus: VertiPaq y la cuantización de LLMs
Trabajando con Power BI, me pregunté: ¿se pueden aplicar estas técnicas a los pesos de un modelo de lenguaje?
Por qué no funciona directamente:
VertiPaq asume datos ordenables con diferencias pequeñas, valores repetidos (RLE) y columnas discretas. Los pesos de un LLM son floats distribuidos ~N(0, σ), casi todos únicos, sin orden natural.
Pero hay técnicas análogas:
| VertiPaq | ML equivalente |
|---|---|
| Dictionary encoding | Weight clustering (K-means sobre pesos, guardar índices) |
| Bit-packing | Cuantización (float32 → int8/int4) |
| RLE | Pruning (eliminar pesos ~0) |
| Value encoding | Delta encoding para updates en federated learning |
Weight clustering es lo más parecido a dictionary encoding:
# Conceptualmente:
pesos_originales = [0.0012, 0.0015, 0.0011, 0.8234, 0.8229, 0.8241]
# Clustering (k=2):
centroides = [0.00127, 0.82347] # "diccionario"
indices = [0, 0, 0, 1, 1, 1] # referencias
# Compresión: 6 floats → 2 floats + 6 índices pequeños
La cuantización (int4/int8) ganó porque es más simple y el hardware tiene instrucciones optimizadas. Weight clustering requiere un paso de lookup que añade latencia.
La conexión: Ambos mundos (BI y ML) resuelven el mismo problema: representar información con menos bits sin perder lo importante. VertiPaq para consultas analíticas rápidas, cuantización para inferencia en GPUs con VRAM limitada.
Las ideas viajan entre dominios. Quien entiende compresion en un contexto tiene ventaja para entenderla en otro. Si vienes de Excel, Power Query es tu puerta de entrada a limpiar datos antes de que lleguen al modelo.
También te puede interesar
Power BI desactivó tu relación y no te avisó
Guía completa sobre relaciones inactivas en Power BI: por qué aparecen, cómo detectarlas, USERELATIONSHIP, role-playing dimensions y patrones avanzados.
Qué es DAX en Power BI: Guía práctica para principiantes (con ejemplos)
Aprende DAX desde cero: qué es, para qué sirve, diferencia con Power Query, las 5 funciones esenciales y errores comunes. Con ejemplos de código.
Medidas Rotativas en DAX: Cuando tus datos no se están quietos
Cómo manejar productos que cambian de categoría con el tiempo en DAX.