3 votes

R Shiny - mise en cache d'un grand ensemble de données

Je suis assez novice en matière de Shiny, donc je m'excuse si ma question est facile. J'ai essayé de vérifier sur google et stackoverflow mais je n'ai pas trouvé de réponse simple et utile jusqu'à présent. Quel est mon objectif/problème : Je suis en train de coder une page Shiny qui affiche un tableau avec des centaines de milliers de lignes. Les données proviennent de différentes bases de données, sont manipulées, nettoyées et affichées à tous les utilisateurs sur demande. Problème 1 : pour charger toutes les données, le script prend presque 5 minutes. Problème 2 : si à 8h00 l'utilisateur 1 demande ces données et à 8h05 l'utilisateur 2 demande les mêmes données, deux requêtes différentes sont lancées et deux espaces différents en mémoire sont utilisés pour afficher exactement les mêmes données à deux utilisateurs différents. La question est donc la suivante : dois-je utiliser un système de cache pour améliorer ce processus ? Si ce n'est pas le cas, que dois-je utiliser d'autre ? J'ai trouvé beaucoup de documentation officielle Shiny sur les parcelles de cache mais rien sur la mise en cache des données (et j'ai trouvé cela assez surprenant). Autre information utile : les données en cache doivent être supprimées tous les soirs vers 22h car de nouvelles données seront disponibles le lendemain / tôt le matin.

Code :

ui <- dashboardPage(  # https://rstudio.github.io/shinydashboard/structure.html
    title = "Dashboard",  
    dashboardHeader(title = "Angelo's Board"),
    dashboardSidebar(   # inside here everything that is displayed on the left hand side
      includeCSS("www/styles.css"),    

      sidebarMenu(      

        menuItem('menu 1', tabName = "menu1", icon = icon("th"),
                 menuItem('Data 1', tabName = 'tab_data1'))

      )),

    dashboardBody( 

      tabItems(

        tabItem(tabName = 'tab_data1')),
      h3("Page with big table"),
      fluidRow(dataTableOutput("main_table"))
    ))

  server <- function(input, output, session) {

    output$main_tabl <- renderDataTable({ 
      df <- data.frame(names = c("Mark","George","Mary"), age = c(30,40,35))
    })

  }

  cat("\nLaunching   'shinyApp' ....")
  shinyApp(ui, server)

Ressources que j'ai utilisées pour rechercher une solution potentielle :

Toute aide serait très appréciée. Merci de votre compréhension.

1voto

Alex Dometrius Points 512

Je séparerais le gros de vos processus ETL dans un script R séparé et je configurerais ce script pour qu'il s'exécute sur un cron. Vous pouvez ensuite demander à ce script d'écrire le(s) dataframe(s) traité(s) dans un fichier .feather. Ensuite, votre application brillante doit charger le(s) fichier(s) feather - feather est optimisé pour la lecture et devrait donc être rapide.

Par exemple, retirez les bibliothèques et le code nécessaires de votre fichier server.R (ou app.R) et créez un nouveau script R appelé query.R. Ce script effectue toutes les opérations ETL et écrit finalement vos données dans un fichier .feather (nécessite le paquetage feather). Créez ensuite une crontab pour exécuter ce script aussi souvent que nécessaire.

Votre server.R script n'a plus qu'à lire ce fichier feather au chargement de l'application et vous devriez constater une amélioration significative des performances. De plus, vous pouvez faire en sorte que le query.R script soit exécuté pendant les heures creuses afin que les performances de la machine linux ne soient pas affectées négativement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X