2016-06-29 38 views
11

dati:Quali sono le migliori pratiche per velocizzare l'esecuzione dell'applicazione lucida?

Ho un'applicazione dashboard lucido e il mio gruppo di dati è di circa 600 MB. Si gonfia di 100 MB al mese. I miei dati risiedono localmente in MySQL.

MenuItems:

Ho 6 - 7 MenuItems barra laterale sul mio cruscotto e ognuno di loro ha 10 - 12 diverse uscite - grafici e tabelle. Ciascuna di queste schede ha 3 - 6 ingressi come selectizeInput, slider, intervallo di date, ecc. Per filtrare i dati.

sottoinsiemi di dati:

Dal momento che non riesco a caricare tutti i dati nella memoria, per ogni voce di menu creo un sottoinsieme di dati in base all'intervallo di date, mantenendo l'intervallo di date a solo 2 - 3 giorni dalla data di sistema.

Ad esempio:

df1 <- reactive({df[df$date >- dateinput[1] & df$date <- dateinput[2], ]})

È possibile che ottiene i dati per la mia prima voce di menu e funzione del selectInput o di altri ingressi, sto ulteriore filtraggio dei dati. Ad esempio, se ho un selectInput per Gender (male and female) poi ulteriormente sottoinsieme df1 a:

df2 <- reactive({ 
     if(is.null(input$Gender)){ 
      df1 
     } else if(input$Gender == "Male") 
      {df1[df1$Gender == "Male",]} 
     )} 

Se ho più di 1 ingresso, sono sottoinsiemi di questi DF1 ulteriormente e trasmettere i valori di DF2. df2 diventa il set di dati reattivo per tutti i grafici e le tabelle in quel MenuItem.

Più il numero di menuItem I crea più sottoinsiemi per adattarsi ai filtri e all'analisi.

mi trovo di fronte due problemi:

  1. Su macchine più vecchie, l'applicazione non viene caricato. e
  2. Su macchine più recenti, i carichi app molto lentamente a volte 5 - 6 minuti

Dopo la prima serie di carico di dati, i grafici e tabelle ottiene resi più veloce sui cambiamenti reattivi.

Per contrastare ciò, ho provato a spostare tutti i parametri e le librerie comuni e ripetitivi su global.R.

Ho due domande:

1.Are Ci sono dei fattori di igiene di base che bisogna tenere a mente quando il data mining in R specialmente attraverso lucido (Mining in R è estremamente veloce).

2. Ho letto sull'elaborazione parallela, ma quasi sempre tutti gli esempi parlano della distribuzione di un singolo calcolo più pesante. Possiamo distribuire attraverso l'elaborazione parallela, inserendo i dati o distribuendo la preparazione di grafici/tabelle.

Si prega di notare, io sono un ricercatore e non un programmatore, ma ho imparato a utilizzare le applicazioni lucide e host sul cloud o localmente di recente.

La guida su questo sarà molto utile per molti utenti alle prime armi di R come me.

+0

Domanda davvero interessante, penso che affronterò questo problema in pochi mesi con la mia dashboard. Stai inviando una richiesta al tuo database SQL tempo di evry o lo stai caricando in Rdata una volta che l'App è in esecuzione? Quindi usando 'df1 [df1 $ Gender ==" Male ",]' per subset i tuoi dati è molto lento, provi ad usare la funzione 'filter' dal pacchetto' dplyr' è molto più veloce quando hai un grande set di dati –

+0

You è necessario capire se la lentezza è dovuta all'accesso al database o alle funzioni R. Ecco alcune idee che potrebbero aiutare http://stackoverflow.com/questions/21484115/code-profiling-for-shiny-app Quando dici che l'app non viene caricata su macchine precedenti, prova a capire se è dovuto a limiti di memoria o la versione del browser ecc. Shiny ha un uso pesante di Javascript che potrebbe non funzionare con i browser più vecchi. –

+0

Un altro punto interessante relativo a questa domanda, che non conosco la risposta a me stesso: se si dispone di più valori reattivi, tutti contenenti grandi (sotto) set di dati, come df1 e df2 in questo esempio, sono quei frame di dati mantenuti in memoria sempre? Direi che lo sono. Se lo sono, potrebbe essere una buona pratica avere un singolo df <- reattivo ({...}) per restituire sempre il dataset 'corrente' su cui si sta lavorando. –

risposta

5

Questa è una domanda molto interessante e merita più risposte corrette anziché commenti. Vorrei mettere in relazione la mia esperienza e i miei pensieri. Ho creato un'applicazione commerciale R+shiny con Shiny Server Pro, utilizzando database (s) e molti altri trucchi.

ritardato UI carico
mia app subentra 30 anni a carico, vale a dire per dare il controllo indietro per l'utente.

La questione

Shiny è una singola applicazione pagina. Pertanto una app complessa, con un sacco di schede, i dati caricati per popolare alcuni dei menu dei selettori & è interessata e questo inizia dal tempo di caricamento iniziale.

UI possibili mitigazioni

  • Utilizzare i componenti di interfaccia utente dinamica (saggiamente) per aggiungere complessità dopo l'avvio. Ad esempio, un particolare menu può iniziare in modo molto semplice con pochi elementi, quindi aggiungere più elementi in una fase successiva.
  • Joe Cheng ha proposto insertUI e removeUI quando la mia applicazione è stata quasi finito, quindi non ho avuto intorno ad usarli, ma potrebbe anche contribuire ad una pagina più semplice per start up.

L'uso di database

mia app utilizzata MonetDB e poi PostgreSQL. Le prestazioni di MonetDB erano buone, ma ho avuto un conflitto con più utenti (problema complesso che non posso dettagliare qui) e questo mi ha costretto a passare a PostgreSQL in alternativa. PostgreSQL andava bene, ma ci è voluto un tempo drammatico per iniziare a causa del problema di riscaldamento della cache. La progettazione richiesta per caricare all'avvio carichi di dati nel DB: progettazione errata.

RDBMS ritarda possibili mitigazioni

penso ho provato la maggior parte dei trucchi con successo variabile.

  • Utilizzo limite RDBMS. Come ho deciso fin dall'inizio di utilizzare data.table a per accelerare le manipolazioni di dati senza limiti di copia, I utilizzava anche fread per qualsiasi tipo di lettura csv. Al momento fwrite (ancora da data.table) non era nemmeno all'orizzonte, altrimenti meriterebbe considerazioni serie.
  • Riprogettazione dell'app. l'architettura dell'app ha molto a che fare con il grado di intensità utilizzato da RDBMS. Sono convinto che il tempo può essere salvato da un design che potrebbe prendere in considerazione le limitazioni R+shiny (principalmente R) .
  • Ora MonetDB ha le funzioni R incorporate nel codice, quindi dovrebbe essere ancora più veloce di prima. Merita sicuramente una buona occhiata. Dall'altro le funzionalità multiutente devono essere testate a fondo: la maggior parte del codice di database R non viene presa in considerazione per essere utilizzata in un ambiente multiutente come offerto da shiny. Forse RStudio dovrebbe fare qualcosa in più su questo. Onestamente hanno già iniziato, con l'introduzione sperimentale di connection pools e questo è grande.

L'uso eccessivo di reattività

Penso che sia bello giocare con un framework avanzato come shiny, e reattività è molto divertente da imparare. D'altra parte, in un'applicazione ampia e complessa, le cose possono facilmente sfuggire di mano.

eccessiva reattività possibile attenuazioni

  • Debug ogni funzione fornisce un'idea precisa di quante volte una particolare funzione shiny viene chiamata e ogni funzione reattiva è chiamati generalmente più di una volta. Naturalmente tutto ciò brucia il tempo di CPU, e ha bisogno almeno di tenere sotto controllo.
  • I costruttori come observeEvent ora hanno parametri come ignoreInit: un uso saggio di questi parametri può salvare almeno un ciclo di annullamento al tempo di inizializzazione .

Nella mia esperienza abbiamo solo scalfito la superficie di ciò che è possibile fare con shiny. D'altra parte c'è un limite dovuto alla natura del singolo processo di R. Con Shiny Server Pro è possibile prevedere l'utilizzo di bilanciamento del carico e la diffusione di più utenti su server diversi. D'altra parte per entrare in questi territori avremmo bisogno di una sorta di sistema di messaggistica attraverso le varie istanze. So già che ne vedo la necessità nelle complesse applicazioni Shiny Server Pro (ad esempio quando è necessario gestire diverse classi di utenti, ma allo stesso tempo comunicare tra loro). Ma questo è fuori dalla portata di questa domanda SO.

+0

sicuro: enzo a smartinsightsfromdata dot com – Enzo