r - 如何让Shiny在 session 结束后恢复内存?

标签 r memory shiny ram

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

在传统 R 中,我经常在删除数据后频繁调用 gc() 来解决这个问题。然而,这似乎在我 Shiny 的应用程序中不起作用。

几个小时的谷歌搜索并没有带来任何有洞察力的东西。在这种情况下有没有一种干净的方法来释放未使用的内存?

最佳答案

也许你可以在observe语句下使用invalidateLatergc()?另外,也许您可​​以将每个 session 限制为某个内存阈值或某个超时(如果可能的话)?您可以在下面看到每个 session 占用了多少内存。另请查看进程中的任务管理器,该进程占用了多少空间(注意:当前示例每个 session 大约需要 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))
        }))
      )
    })
  }
))

关于r - 如何让Shiny在 session 结束后恢复内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33502903/

相关文章:

R无法加载dplyr

r - 如何遍历列名向量,通过赋值回到列和函数引用循环索引来改变每一列

c - 我怎样才能 "Hibernate"一个应用程序?

r - 单击下载按钮后如何关闭 Shiny 的模式框

r - 在 Shiny 中使用 googlevis 绘制动态 UI

r - 使用 fileInput Shiny R 打开特定目录

r - 从多个数据框中绘制多条线

r - Shiny 的 R : Conditional style for textInput

perl - 是否有 CPAN Perl 模块来查找主机上的总/已用/可用内存(无需通过 system() 调用运行命令行)?

linux -/proc/meminfo 中的条目