2014-08-27 31 views
7

Używam małej aplikacji internetowej korzystającej z błyszczącej ramy R. Narzędzie nie robi tak wiele. To tylko filtrowanie ramek danych z danymi parametrami z interfejsu użytkownika. Problem, który mam teraz, jest następujący. Jeśli użytkownik uzyskuje dostęp do aplikacji przez http, uruchomienie aplikacji trwa długo. Ponieważ dane, które ładuję w urządzeniu global.R, są dość duże (~ 5 GB). Po pierwszym uruchomieniu aplikacja działa płynnie, także przy ponownym dostępie w określonym czasie (aplikacja wydaje się być całkowicie w pamięci, przez kilka minut). Ponieważ mam wystarczająco dużo pamięci, a moje dane nie zmieniają się w wyniku interakcji użytkownika, zadaję sobie pytanie, czy mogę przechowywać całą aplikację w pamięci. Czy można to wymusić? Mój serwer działa centOS 6. Problemem nie jest też system plików, dysk twardy itp. - Stworzyłem dysk RAM, aby załadować dane, ale wzrost wydajności jest marginalny. Więc szyjka butelki wydaje się być R, podczas przetwarzania danych.R Błyszczące w pamięci Aplikacja lub noSQL

Teraz mam dwie pomysły, które mogą przezwyciężyć problem.

  • Tak jak wspomniałem, czy można zachować całą aplikację w pamięci?
  • Nie zapisuj danych jako obiektów R, zamiast tego używaj szybkiej bazy danych noSQL np. Redis, który jest w pamięci

Może jeden z was ma pewne doświadczenie przy ładowaniu większych danych. Byłbym wdzięczny, gdyby udało mi się przeprowadzić dyskusję. Jeśli to możliwe, chciałbym uniknąć zewnętrznego oprogramowania, takiego jak Redis, aby wszystko było tak proste, jak to tylko możliwe.

Z wszystkiego najlepszego,

Mario

Odpowiedz

0

mam żadnego doświadczenia z bazami danych NoSQL, ale tutaj jest jak mam łączenie błyszczące z bazy danych Oracle, aby przyspieszyć swoje aplikacje:

dane wprowadzane przez użytkownika są przekazywane do kwerendy sql, która jest wysyłana do wyjątkowo szybkiej bazy danych, a tylko wynik tej kwerendy jest odczytywany R. W wielu przypadkach (szczególnie jeśli sql wymaga instrukcji group by statement) zmniejsza to liczbę obserwacji do odczytania od kilku milionów do kilkuset. Dlatego ładowanie danych staje się bardzo szybkie.

W poniższym przykładzie użytkownicy najpierw wybierają kwestionariusze i zakres dat. Generuje to wyrażenie sql, które filtruje odpowiednie obserwacje i zlicza częstotliwości odpowiedzi na pytanie i kwestionariusz. Częstotliwości te są odczytywane w R i wyświetlane jako dane w błyszczącej aplikacji.

library(shiny) 
library(ROracle) 
library(DT) 

drv <- dbDriver("Oracle") 
con <-dbConnect(drv, username = "...", password = '...', dbname = "...") 

query <- 'select distinct questionnaire from ... order by questionnaire' 
questionnaire.list <- dbGetQuery(con, query)$questionnaire 


ui <- fluidPage(
     selectInput('questionnaire_inp','Questionnaire', 
        choices=questionnaire.list,selected=questionnaire.list,multiple=T), 
     dateRangeInput("daterange_inp", "Date range", 
        start='2016-01-01', end=Sys.Date()), 
     dataTableOutput('tbl') 
) 

server <- function(input, output) { 

    output$tbl <- renderDataTable({ 
    query <- paste0(
     "select questionnaire, question, answer, count(*) from ... 
     where title in (", paste0(shQuote(input$questionnaire_inp), collapse=","), ") 
     and date between to_date('", input$daterange_inp[1] ,"','YYYY-MM-DD') 
     and to_date ('", input$daterange_inp[1] ,"','YYYY-MM-DD') 
     group by questionnaire, question, answer") 
    dt <- dbGetQuery(con, query) 
    datatable(dt) 

    }) 

shinyApp(ui = ui, server = server) 
0

Możesz set the timeout to be a longer value. Nie jestem pewien, czy możliwe jest podanie wartości nieskończonej (lub wystarczająco długiej).

Inne sposoby nie obejmujące bazę danych mogą być:

  1. użycie data.tablefread jeśli odczytać z csv. To może być kilka razy szybsze niż read.csv. Określ, które klasy kolumn mogą jeszcze bardziej zwiększyć szybkość.

  2. Lub użyj formatu binarnego .RDS, który powinien być szybki i mniejszy, aby szybciej go przeczytać.

Jeśli używasz .RDS.Rdata już nie ma wiele do zrobienia w tym zakresie.