2015-11-03 35 views
3

我有一个闪亮的应用程序,允许每个用户选择要加载的数据集。应用程序中的所有内容都很棒,除了内存使用情况。会话结束后,用户关闭网页浏览器后,Shiny不会将可用内存还原到正在运行的计算机上。最终,在访问足够多的时间后,内存不足。如何让Shiny在会话结束后回馈内存?

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

Google的时间还没有提供任何有见地的。在这种情况下是否有一种干净的方式来释放未使用的内存?

回答

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)) 
     })) 
    ) 
    }) 
    } 
)) 
+0

这个答案是非常有用和示例工作完全一样我想我的代码通过释放工作up内存。但是,当我将示例应用于我的代码时,它不释放内存。我现在知道它应该如何工作,这是对我的理解,为什么它不是这样工作的!我会看看我是否可以在这里发布我的代码示例。 – rfguy