2015-11-03 75 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