R Shiny Memory Leak - Предложения о том, как найти? - PullRequest
0 голосов
/ 18 октября 2018

Я ищу общие идеи о том, как определить утечки памяти в блестящей программе для R. Я изо всех сил пытаюсь точно определить, откуда происходит утечка, поэтому трудно воссоздать, и мой код уже превышает 1000линий.Я уверен, что это связано с наблюдением и наблюдением событий, но я не могу точно определить это.Мне на самом деле понравилась идея, предложенная здесь bborgeser, с использованием опций responselog: https://github.com/rstudio/shiny/issues/1591 Но когда я попробую это, showReactLog () не загрузится.Я предполагаю, что мой код слишком велик для этого.

Итак, мой главный вопрос: как лучше всего определить утечку памяти?Я использую пакет pryr для отслеживания памяти, используемой после каждой отправки.Так что я могу сказать, что память увеличивается.Я нашел несколько других статей об утечках памяти, но они больше касаются конкретных проблем, а не общего вопроса: https://github.com/rstudio/shiny/issues/931

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

В этом коде, в частности, я знаю, что утечка памяти определенно находится в Reactive / Observe.Если я их заблокирую, память не увеличится.Но я уверен, что вы можете использовать реактив и наблюдать, не увеличивая память.Таким образом, это возвращает меня к моему первоначальному вопросу, в данном случае я нашел его, медленно блокируя разделы, но даже когда я пытаюсь это сделать с моим большим кодом, я не могу точно определить, из какого раздела это происходит.Так как же люди находят свои утечки?

    #Library Load##########################################################################################
lapply(c("shiny","tidyverse","shinydashboard","shinyjs","pryr"),require,character.only = T)
#ui, shiny body#########################################################################################
body<-dashboardBody(
  useShinyjs(),
            ({
              tabs<-lapply(1:length(1:8), function(x){
                tabPanel(box(title = paste0('Tab ',x),  width = NULL),
                fluidPage(
                  div(id = paste0("BOX_",x),
                      column(width = 6, align = "center",
                          lapply(seq(1,15,2),function(y){
                              div(id = paste0("Box_ID_",x,"_",y),
                                  box(width = NULL, title = paste0("Reading",((y/2)+.5)),
                                      column(width = 4,
                                             numericInput(paste0("Number_",x,"_",y), label = paste0("Number - ",y), value = 0, min = 0, max = 60, step = .1)),
                                      column(width = 4,
                                             numericInput(paste0("Number_",x,"_",y+1), label = paste0("Number - ",y+1), value = 0, min = 0, max = 60, step = .1))))
                          })),
                      column(width = 2, align = "center",
                                 actionButton(paste0("Complete_",x),"Complete"))
                  )))
              }) 
              do.call(tabBox, c(tabs, list(width = NULL)))
            }))
##UI combination###################
ui<-dashboardPage(
  dashboardHeader(disable = T),
  dashboardSidebar(disable = T),
  body)
#######Server################
server <- function(input, output, session) {
  #Tab 1 - Reactive Average
  Avg<-reactive({
    lapply(1:8, function(x) {
      lapply(seq(1,15,2),function(y){
        req(input[[paste0("Number_",x,"_",y)]],input[[paste0("Number_",x,"_",y+1)]])
        if(input[[paste0("Number_",x,"_",y)]] == 0 | input[[paste0("Number_",x,"_",y+1)]] == 0) {0} else {
          (input[[paste0("Number_",x,"_",y)]]+input[[paste0("Number_",x,"_",y+1)]])/2}
      })
    })
  })

  #Tab 1 - Show or hide boxes
  lapply(1:8, function(x) {
    lapply(seq(1,15,2),function(y){
      observe({
        req(input[[paste0("Number_",x,"_",y)]],input[[paste0("Number_",x,"_",y+1)]])
        if(y == 1 & Avg()[[x]][[(y/2)+.5]] <= 30) {
          shinyjs::show(paste0("Box_ID_",x,"_",1))
          shinyjs::hide(paste0("Box_ID_",x,"_",3))
        } else if(y == 1 & Avg()[[x]][[(y/2)+.5]] > 30) {
          shinyjs::show(paste0("Box_ID_",x,"_",1))
          shinyjs::show(paste0("Box_ID_",x,"_",3))
        } else if(Avg()[[x]][[(y/2)+.5]] > 30) {
          shinyjs::show(paste0("Box_ID_",x,"_",y+2))
        } else {shinyjs::hide(paste0("Box_ID_",x,"_",y+2))}
      })
    })
  })

  #Tab 1 - Submit Button - Reset boxes, create data frame and append to file. 
  lapply(1:8,function(x){
    observeEvent(input[[paste0("Complete_",x)]],{
     #Reset the page
      reset(paste0("BOX_",x))
      #Garabage collect
      gc()
      #Print memory used. Tracking memory leaks
      print(mem_used())
    })
  })
}
shinyApp(ui, server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...