Forum Discussion

michaelsh's avatar
michaelsh
Kudo Kingpin
5 years ago
Solved

Uso de Table.Buffer

Me estoy conectando a una carpeta que tiene un montón de archivos JSON.

Utilizo una función personalizada para combinar los archivos.

Luego hago todo tipo de cosas, como extraer dinamitamente los nombres de columna de listas json anidadas, etc.

Siento que Table.Buffer / List.Buffer puede acelerar las cosas.

He leído esto:

https://www.thebiccountant.com/speedperformance-aspects/

Y esto:

https://blog.crossjoin.co.uk/2015/05/05/improving-power-query-calculation-performance-with-list-buffer/

Y todavía me pregunto - cuando shoud uso Table.Buffer?

¿Por qué no ponerlo al principio de mi consulta (justo después de ejecutar la función personalizada) - y eso es todo - todo se sentará en la memoria?

  • No @michaelsh

    Si almacena en búfer una tabla en un paso y, a continuación, transforma esa tabla de alguna manera, esta nueva tabla transformada no es la que se almacena en búfer.

    Por lo tanto, en los pasos siguientes no puede seguir haciendo referencia a la tabla almacenada en búfer desde el primer paso.

    Para ser honesto, el funcionamiento de las funciones de búfer no es claramente desapreotable por nadie que no sea el equipo de desarrollo de Microsoft. Nunca he leído una explicación definitiva de cómo o cuándo usarlos, por lo tanto, la sugerencia de Pat de 'simplemente probarlos'.

    Salud

    Phil

7 Replies

  • v-alq-msft's avatar
    v-alq-msft
    Community Support

    Hola, @michaelsh

    Puede utilizar 'Table.Buffer'/'List.Buffer' cuando la tabla o lista se hará referencia varias veces (como en 'Table.SelectRows', 'List.Generate', 'List.Accumulate').

    En el ejemplo siguiente, se hace referencia a la tabla 'a' tiempos múltiples.

    =Table.AddColumn(a,"Custom",each Table.RowCount(Table.SelectRows(a,(x)=>x[Subject]=[Subject] and x[Score]=[Score]))+1)

    A continuación, puede usar 'Table.Buffer' para almacenar la tabla en memoria para mejorar el rendimiento.

    A=Table.Buffer(a),
    Table.AddColumn(A,"Custom",each Table.RowCount(Table.SelectRows(A,(x)=>x[Subject]=[Subject] and x[Score]=[Score]))+1)

    Espero que le ayude a entender 'Table.Buffer'/'List.Buffer'.

    Saludos

    Allan

    Si este post ayuda,entonces considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Administrator

      Sí, @v-alq-msft , esto es útil, gracias!

      Lo que no obtengo - es por qué no debería simplemente escribir Table.Buffer como mi segundo paso y, a continuación, todos los demás pasos simplemente harán referencia a esta tabla almacenada en búfer.

      ¿Funcionará?

      ¿Por qué no hacerlo? (Considere que tengo suficiente memoria)

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Administrator

      @v-alq-msft ¿Podría explicar por qué el almacenamiento en búfer una vez no es suficiente? ¿Por qué uno necesita almacenar repetidamente una tabla si "se hace referencia a ella varias veces" como usted dice?

  • Hola @michaelsh

    Puede hacerlo, siempre que la tabla a la que hace referencia no se cambie de ninguna manera en los pasos posteriores. Sin embargo, esto no suele ser el caso, por lo que cada vez que se transforma una tabla, lo que da como resultado una nueva tabla, tendría que volver a usar Table.Buffer.

    saludos

    Phil


    Si respondí a su pregunta por favor marque mi post como la solución.
    Si mi respuesta ayudó a resolver su problema, déle un kudos haciendo clic en Thumbs Up.

    • michaelsh's avatar
      michaelsh
      Kudo Kingpin

      Veo @PhilipTreacy .

      Pero si los pasos subsiguientes modifican la tabla, ¿sigue siendo mejor almacenar en búfer solo el primero, para que los pasos siguientes no vuelvan al origen de datos original, sino solo a la primera tabla almacenada en búfer?

      Hemos detectado un problema desconocido.

      ¿Quizás puedas proporcionar una muestra?

      Gracias

      • PhilipTreacy's avatar
        PhilipTreacy
        Super User

        No @michaelsh

        Si almacena en búfer una tabla en un paso y, a continuación, transforma esa tabla de alguna manera, esta nueva tabla transformada no es la que se almacena en búfer.

        Por lo tanto, en los pasos siguientes no puede seguir haciendo referencia a la tabla almacenada en búfer desde el primer paso.

        Para ser honesto, el funcionamiento de las funciones de búfer no es claramente desapreotable por nadie que no sea el equipo de desarrollo de Microsoft. Nunca he leído una explicación definitiva de cómo o cuándo usarlos, por lo tanto, la sugerencia de Pat de 'simplemente probarlos'.

        Salud

        Phil

  • mahoneypat's avatar
    mahoneypat
    Microsoft Employee

    La mejor manera es simplemente probarlo y ver si hace las cosas significativamente más rápido. Difícil de predecir si tendrá un impacto como a veces lo es hace ese tipo de optimización por sí mismo. La clave es usarlo dentro de la misma consulta donde se hace referencia a él varias veces (lo que hace su propuesta).

    saludos
    palmadita