如何让Shiny在会话结束后回馈内存?

时间:2015-11-03 15:26:53

标签: r memory shiny ram

我有一个闪亮的应用程序,允许每个用户选择要加载的数据集。应用程序中的所有内容都非常精彩,除了内存使用情况。会话结束并且用户关闭Web浏览器后,Shiny不会将可用内存返回给正在运行的计算机。最终,在访问它足够多次之后,它就会耗尽内存。

在传统的R中,我经常在删除数据后频繁调用gc()来处理这个问题。但是,这似乎不适用于我闪亮的应用程序。

谷歌搜索的时间没有任何洞察力。在这种情况下,有没有一种方法可以释放未使用的内存?

1 个答案:

答案 0 :(得分:2)

也许您可以gc()observe声明下invalidateLater?也许你可以限制每个会话到一些内存阈值或一些超时如果可见?您可以在下面看到每个会话占用的内存量。另请查看进程中的任务管理器此进程需要多少(注意:当前示例每个会话大约需要440Mb

rm(list = ls())
library(shiny)

cleanMem <- function(n=10) { for (i in 1:n) gc() }

runApp(list(
  ui = fluidPage(
    tableOutput('foo')
  ),
  server = function(input, output,session) {

    observe({
      # periodically collect
      invalidateLater(1000,session)
      cleanMem()
    })

    x1 <- 1:100000000
    x2 <- rbind(mtcars, mtcars)
    env <- environment()  # can use globalenv(), parent.frame(), etc
    output$foo <- renderTable({
      data.frame(
        object = ls(env),
        size = unlist(lapply(ls(env), function(x) {
          object.size(get(x, envir = env, inherits = FALSE))
        }))
      )
    })
  }
))