Блестящий обработчик загрузки ненужного большого файла - PullRequest
1 голос
/ 07 мая 2020

Я создаю приложение shiny, в котором вы можете обучать модель. Одна из функций - иметь возможность загрузить объект модели (в данном случае объект glm), чтобы пользователь мог использовать его позже - вне приложения. Соответствующая часть моего кода выглядит следующим образом:

library(shiny)
library(car)

ui <- fluidPage(

  # What parameter do you wish to estimate
  selectInput(inputId = "dependent_variable",
              label = "Select dependent variable",
              choices = c("education",
                          "vocabulary")),

  # Download button for model
  downloadButton(outputId = "download_model", label = 'Download Model')
)

server <- function(input, output){

  strip_glm <- function(cm) {
    cm$y <- c()
    cm$model <- c()

    cm$residuals <- c()
    cm$fitted.values <- c()
    cm$effects <- c()
    cm$qr$qr <- c()  
    cm$linear.predictors <- c()
    cm$weights <- c()
    cm$prior.weights <- c()
    cm$data <- c()


    cm$family$variance <- c()
    cm$family$dev.resids <- c()
    cm$family$aic <- c()
    cm$family$validmu <- c()
    cm$family$simulate <- c()
    attr(cm$terms,".Environment") <- c()
    attr(cm$formula,".Environment") <- c()

    return(cm)
  }

  reactive_glm_model <- reactive(glm(paste0(input$dependent_variable, "~."), data = Vocab))
  stripped_glm <- reactive(strip_glm(reactive_glm_model()))
  stripped_glm_summary <- reactive(summary(reactive_glm_model()))

  output$download_model <- downloadHandler(
    filename = function() {
      "report.Rd"
    },
    content = function(file) {

      glm_object <- stripped_glm()
      glm_summary <- stripped_glm_summary()
      save(glm_object, glm_summary, file = file)
    }
  )

}

shinyApp(ui, server)

Я использую функцию strip_glm(), потому что я не хочу, чтобы объект glm был слишком большим и содержал ненужные прочее. Он должен только уметь предсказывать. Однако при удалении glm summary() больше не работает, поэтому я хотел бы также вернуть сводку.

Итак, вот моя проблема: если я загружу объект, все еще есть некоторые «скрытые» объекты делают файл слишком большим. В этом представлении это 16,2 МБ, тогда как если я загружаю соответствующий объект обратно в память, я обнаруживаю, что реальный размер объекта намного меньше

load("report.Rd")
object.size(glm_object) # 22 kB
object.size(glm_summary) # 2.5 MB

Что здесь происходит? В моделях, которые я использую, мои данные потенциально содержат миллионы строк, поэтому размер объекта составляет несколько ГБ, а загрузка занимает много времени.


ОБНОВЛЕНИЕ

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

platform       x86_64-redhat-linux-gnu     
arch           x86_64                      
os             linux-gnu                   
system         x86_64, linux-gnu           
status                                     
major          3                           
minor          5.2                         
year           2018                        
month          12                          
day            20                          
svn rev        75870                       
language       R                           
version.string R version 3.5.2 (2018-12-20)
nickname       Eggshell Igloo

К сожалению, я не могу обновить версию R из-за ограничений политики


ОБНОВЛЕНИЕ II

Кажется, проблема не связана с R или shiny и не воспроизводится на разных платформах

1 Ответ

2 голосов
/ 11 мая 2020

Коллега здесь. Мы запускаем этот код с RStudio Server, который, кажется, вызывает проблему. Запуск представителя с самим R (но все еще на том же сервере с тем же исполняемым файлом R) в обход RStudio устраняет проблему, а загруженный объект R имеет размер чуть более 2 МБ.

Не знаю, почему использование RStudio все портит. Используемая версия - RStudio Server (Pro) 1.2.5001-3

...