jueves, 13 de mayo de 2021

Power Query: Table.Buffer trabajando en memoria

Una breve entrada para hablar sobre la función M: Table.Buffer(table as table) as table
La verdad es que es bastante controvertida esta función (o su equivalente para Listas: List.Buffer(list as list) as list).
A priori la idea planteada es buena... carga o almacena en temporal (concretamaente en el búfer) una tabla o lista, y la aisla de los cambios externos durante la evaluación.

El búfer - término informático difícil de comprender, que no es ni la caché ni la ram.. pero se parece- es la memoria de transferencia, y al igual que la memoria caché también es una memoria almacenamiento temporal pero que tiene una finalidad distinta.
El fin último del 'búfer' es asegurar que los datos que se transfieren sea estables y constantes.

Esto es, suponemos que almacenar en el búfer una de nuestras tablas/listas durante la operativa de creación de nuestras consultas es buena idea, ya que agiliza y asegura el proceso de 'cálculo'.
Obviamente esto tiene un consumo de memooria asociado!!.
A grandes rasgos, sin almacenamiento en el búfer, todas las filas de una tabla se transmitirían a la hoja de cálculo y solo se usaría una pequeña cantidad de memoria.
Pero con el almacenamiento en el búfer, se leerían todas las filas de nuestra tabla en la memoria.

IMPORTANTE: Power Query limita la cantidad de datos a almacenar en la memoria caché.
Cualquier consumo superior a ese límite se almacenaría en nuestro disco duro, lo cual es muchísimo más lento que acceder a la RAM (incluso si trabajamos con discos duros SSD)!.
En nuestro editor de Power Query podemos controlar la cantidad de RAM que destinamos a este uso.
Accederíamos desde el menú Archivo a las Opciones y Configuración > Opciones de consulta > sección Global > Carga de datos > Opciones de administración de caché
Power Query: Table.Buffer trabajando en memoria
Creo que nadie en su sano juicio adelantaría una opinión definitiva y general de usar o no usar siempre estas funciones, ya que en último término dependerá del volumen de datos que movamos en nuestras consultas y de nuestro equipo (RAM, HD, etc..).
Seguramente bajo ciertas condiciones incluso resulte contraproducente su uso, y consigamos el efecto contrario al deseado... haciendo más lentas nuestras consultas.
La mejor recomendación: prueba a ver que pasa :D

Dicho todo esto, hoy veremos un comportamiento que cuanto menos parece curioso (para mi incluso inexplicable) de la función Table.Buffer
Supongamos una simple tabla en Excel que cargamos al Editor de Power Query y vemos qué tenemos:
Power Query: Table.Buffer trabajando en memoria

Nos vamos a fijar a partir de ahora en la columna 'Orden'.
Añadiremos un nuevo paso a la consulta donde ordenaremos primero por 'País' y luego por 'Producto':
Power Query: Table.Buffer trabajando en memoria

Ha ocurrido algo 'raro' al aplicar esta regla doble de ordenación sobre una tabla ya ordenada en origen... se ha producido un cambio de posición en algunas de las filas (por qué??).
Pero lo más curioso viene ahora.. si aplicamos la función Table.Buffer al paso anterior se produce una ordenación 'extra' en base al campo 'Orden' en sentido descendente ¿¿??
Power Query: Table.Buffer trabajando en memoria
No me quiero quejar, muy práctico en casos como el expuesto en el post anterior (ver aquí), pero desesperante no comprender el motivo de este proceso :'(
Parece (es una suposición) que al tener una orden Table.Sort sobre algunos campos, entiende que tiene sentido forzar una ordenación en sentido inverso. Quiero decir, si con Table.Sort indico un Order.Ascending, Table.Buffer 'aplica' un orden descendente sobre ese campo...
Y si Table.Sort tiene un Order.Descending entonces Table.Buffer aplica un orden ascendente:
Power Query: Table.Buffer trabajando en memoria

Por cierto, con ordenaciones múltiples 'mezcladas Descending + Ascendig', el comportamiento es totalmente errático...

Al margen de todo esto, nos quedaremos con la oportunidad que nos ofrece de agilizar (o no) nuestras consultas...

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.