VertiPaq para humanos: cómo Power BI comprime tus datos

· 5 min de lectura · Leer en English
Compartir:

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:

IDColor
0Red
1White
2Black
3Blue

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:

  1. DAX Studio - VertiPaq Analyzer te dice exactamente qué columna ocupa cuánto
  2. Busca columnas con alta cardinalidad que no deberían tenerla
  3. Busca columnas de texto que podrían ser IDs numéricos
  4. 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:

VertiPaqML equivalente
Dictionary encodingWeight clustering (K-means sobre pesos, guardar índices)
Bit-packingCuantización (float32 → int8/int4)
RLEPruning (eliminar pesos ~0)
Value encodingDelta 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.

¿Te ha sido útil? Compártelo

Compartir:

También te puede interesar