Блестящие приложения вычисляются очень медленно с большим набором данных - PullRequest
0 голосов
/ 02 октября 2018

В настоящее время я разрабатываю блестящее приложение для клиента с большим набором данных (1,5 ГБ CSV, который я сжал до 150 МБ RDS).У меня возникают проблемы каждый раз, когда пользователь меняет ввод, кажется, что самый медленный шаг, импорт данных выполняется с каждым изменением.Вот минимальный пример (приложение немного сложнее, но проблема та же).

UI.R (базовый пример из R studio, здесь нет ничего важного, только выбор ввода и ggplot):

library(shiny)

# Define UI for application that draws a histogram
shinyUI(fluidPage(

  # Application title
  titlePanel("Old Faithful Geyser Data"),

  # Sidebar with a slider input for number of bins 
  sidebarLayout(
    sidebarPanel(
      selectInput("select_z", "Z Value", selected = 387.5,c(seq(293.5,443.5,1)))
    ),

    # Show a plot of the generated distribution
    mainPanel(
       plotOutput("distPlot")
    )
  )
))

Server.R (оператор readRDS из функции сервера и простой фильтр dplyr)

library(shiny)
library(dplyr)
library(magrittr)
library(ggplot2)

data <- readRDS('./data.rds')

# Define server logic required to draw a histogram
shinyServer(function(input, output) {

  output$distPlot <- renderPlot({

    # generate bins based on input$bins from ui.R
    filtered_data <- data %>% filter(Z == input$select_z)

    # draw the histogram with the specified number of bins
    ggplot(filtered_data)+
      geom_histogram(aes(X))

  })

})

Начальная загрузка занимает примерно 10 секунд (как обычно), но проблема заключается в том, чтокаждый раз, когда пользователь меняет входные данные.

Я тестировал ту же настройку в нереактивной среде, и время намного быстрее, показывая, что единственным ограничением является импорт данных, остальные операции занимают меньше чемсекунда.

system.time(readRDS('./data.rds'))
   user  system elapsed 
  3.121   0.396   3.524 
> system.time(filtered_data <- data %>% filter(Z == 384.5))
   user  system elapsed 
  0.048   0.011   0.059 
> system.time(ggplot(filtered_data)+geom_histogram(aes(X)))
   user  system elapsed 
  0.001   0.000   0.001 

Я думаю, что проблема в том, что оператор импорта данных выполняется каждый раз, когда изменяется вход, но я не нашел способа предотвратить это.

Спасибо

1 Ответ

0 голосов
/ 02 октября 2018
  • В идеале, вам не нужно загружать файлы такого большого размера в память и использовать вместо них базы данных, взгляните на эти варианты хранения с rstudio веб-сайта.
  • Что может улучшить взаимодействие с пользователем, так это использование debounce, когда selectInput будет задерживаться на некоторое количество перед стрельбой

shinyServer(function(input, output,session) {

  selection <- reactive({
    input$select_z
  })

  # add a delay of 1 sec
  selected_z <- selection %>% debounce(1000)

  output$distPlot <- renderPlot({
    # generate bins based on input$bins from ui.R
    filtered_data <- data %>% filter(Z == selected_z())

    # draw the histogram with the specified number of bins
    ggplot(filtered_data)+
      geom_histogram(aes(X))
  })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...