mar*_*eng 7 r nosql in-memory-database redis shiny
我正在使用R的闪亮框架运行一个小型Web应用程序.该工具没有那么多.它只是过滤来自UI的给定参数的数据帧.我现在遇到的问题如下.如果用户通过http访问应用程序,则需要很长时间才能启动应用程序.因为我加载的数据global.R相当大(~5GB).初次启动后,应用程序运行顺畅,同时在给定时间内重新访问(应用程序似乎完全在内存中,持续几分钟).由于我有足够的可用内存,并且我的数据不会因用户交互而改变,我问自己是否可以将完整的应用程序保留在内存中.有可能强迫这个吗?我的服务器正在运行centOS 6.此外,问题不在于文件系统,硬盘等. - 我创建了一个ram磁盘来加载数据,但性能提升是微不足道的.所以在处理数据时,瓶颈似乎是R.
现在我有两个想法,可以解决这个问题.
愿你们中的一个人在加载更大的数据时有一些经验.如果可以进行讨论,我将感激不尽.如果可能的话,我想避免像Redis这样的外部软件尽可能地保持一切.
一切顺利,
马里奥
我没有使用 noSQL 数据库的经验,但以下是我如何将shiny 与 Oracle 数据库结合起来以加速我的应用程序:
用户输入被传递到一个 sql 查询,该查询被发送到极快的数据库,并且只有该查询的输出被读入 R。在许多情况下(特别是如果 sql 涉及 group by 语句),这会将观察数量减少到阅读量从几百万到几百。因此,数据加载变得非常快。
在下面的示例中,用户首先选择调查问卷和日期范围。这会生成一条 sql 语句,用于过滤相关观察结果并计算每个问题和调查问卷的答案频率。这些频率被读入 R 并在闪亮的应用程序中显示为数据表。
library(shiny)
library(ROracle)
library(DT)
drv <- dbDriver("Oracle")
con <-dbConnect(drv, username = "...", password = '...', dbname = "...")
query <- 'select distinct questionnaire from ... order by questionnaire'
questionnaire.list <- dbGetQuery(con, query)$questionnaire
ui <- fluidPage(
selectInput('questionnaire_inp','Questionnaire',
choices=questionnaire.list,selected=questionnaire.list,multiple=T),
dateRangeInput("daterange_inp", "Date range",
start='2016-01-01', end=Sys.Date()),
dataTableOutput('tbl')
)
server <- function(input, output) {
output$tbl <- renderDataTable({
query <- paste0(
"select questionnaire, question, answer, count(*) from ...
where title in (", paste0(shQuote(input$questionnaire_inp), collapse=","), ")
and date between to_date('", input$daterange_inp[1] ,"','YYYY-MM-DD')
and to_date ('", input$daterange_inp[1] ,"','YYYY-MM-DD')
group by questionnaire, question, answer")
dt <- dbGetQuery(con, query)
datatable(dt)
})
shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
456 次 |
| 最近记录: |