会话结束后如何让 Shiny 归还内存?
How to make Shiny give back memory after a session ends?
我有一个闪亮的应用程序,允许每个用户select加载哪个数据集。应用程序中的所有内容都运行良好,但内存使用情况除外。会话结束且用户关闭网络浏览器后,Shiny 不会将空闲内存归还给 运行 所在的机器。最终,在访问它足够多次后,它会耗尽内存。
在传统的 R 中,我经常通过在删除数据后频繁调用 gc() 来解决这个问题。但是,这似乎在我闪亮的应用程序中不起作用。
数小时的谷歌搜索没有提供任何有见地的信息。在这种情况下,是否有一种干净的方法来释放未使用的内存?
也许你可以 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))
}))
)
})
}
))
我有一个闪亮的应用程序,允许每个用户select加载哪个数据集。应用程序中的所有内容都运行良好,但内存使用情况除外。会话结束且用户关闭网络浏览器后,Shiny 不会将空闲内存归还给 运行 所在的机器。最终,在访问它足够多次后,它会耗尽内存。
在传统的 R 中,我经常通过在删除数据后频繁调用 gc() 来解决这个问题。但是,这似乎在我闪亮的应用程序中不起作用。
数小时的谷歌搜索没有提供任何有见地的信息。在这种情况下,是否有一种干净的方法来释放未使用的内存?
也许你可以 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))
}))
)
})
}
))