2014-08-27 21 views
7

Tôi đang chạy một ứng dụng web nhỏ sử dụng khuôn khổ sáng bóng của R. Công cụ không làm điều đó nhiều. Nó chỉ lọc các khung dữ liệu với các tham số đã cho từ giao diện người dùng. Vấn đề tôi có bây giờ là như sau. Nếu người dùng đang truy cập ứng dụng qua http, thì phải mất một thời gian dài để khởi động Ứng dụng. Kể từ khi dữ liệu, mà tôi tải trong global.R, là khá lớn (~ 5GB). Sau một khởi đầu ban đầu, Ứng dụng đang chạy trơn tru, cũng như khi truy cập lại trong một thời gian nhất định (ứng dụng dường như hoàn toàn trong bộ nhớ, trong một vài phút). Vì tôi có đủ bộ nhớ khả dụng và dữ liệu của tôi không thay đổi theo tương tác của người dùng, tôi tự hỏi liệu tôi có thể giữ cho Ứng dụng hoàn chỉnh trong bộ nhớ hay không. Có thể ép buộc điều này không? Máy chủ của tôi đang chạy CentOS 6. Ngoài ra vấn đề không phải là hệ thống tệp, đĩa cứng, v.v. - Tôi đã tạo ra một đĩa ram để tải dữ liệu từ, nhưng hiệu suất tăng là biên. Vì vậy, cổ chai có vẻ là R, khi xử lý dữ liệu.R Sáng bóng trong ứng dụng bộ nhớ hoặc noSQL

Bây giờ tôi có hai ý tưởng, có thể khắc phục được sự cố.

  • Như tôi đã đề cập, có thể giữ ứng dụng hoàn chỉnh trong bộ nhớ không?
  • Không lưu dữ liệu dưới dạng đối tượng R, thay vào đó hãy sử dụng DB nhanh chóng, ví dụ: Redis có trong bộ nhớ

Có thể một số bạn có một số kinh nghiệm khi tải dữ liệu lớn hơn. Tôi sẽ biết ơn nếu có thể thảo luận. Nếu có thể, tôi muốn tránh phần mềm bên ngoài, như Redis, để giữ mọi thứ càng đơn giản càng tốt.

Với tất cả các tốt nhất,

Mario

Trả lời

0

Tôi không có kinh nghiệm với cơ sở dữ liệu NoSQL, nhưng đây là cách tôi đang kết hợp sáng bóng với một cơ sở dữ liệu Oracle để tăng tốc độ ứng dụng của tôi:

đầu vào tài khoản được chuyển đến một truy vấn sql được gửi đến cơ sở dữ liệu cực nhanh, và chỉ đầu ra của truy vấn này được đọc vào R. Trong nhiều trường hợp (đặc biệt nếu sql liên quan đến một nhóm theo câu lệnh), điều này làm giảm số quan sát cần đọc từ vài triệu đến vài trăm. Do đó, tải dữ liệu trở nên rất nhanh.

Trong ví dụ bên dưới, trước tiên người dùng chọn bảng câu hỏi và phạm vi ngày. Điều này tạo ra một câu lệnh sql để lọc các quan sát có liên quan và đếm tần suất các câu trả lời cho mỗi câu hỏi và bảng câu hỏi. Các tần số này được đọc vào R và được hiển thị dưới dạng một dữ liệu có thể đặt trong ứng dụng sáng bóng.

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

Bạn có thể set the timeout to be a longer value. Tôi không chắc chắn nếu giá trị vô hạn (hoặc giá trị đủ dài) là có thể.

cách khác không liên quan đến một cơ sở dữ liệu có thể là:

  1. sử dụng data.tablefread nếu bạn đọc từ csv. Điều này có thể nhanh hơn vài lần so với read.csv. Chỉ định các lớp cột có thể cải thiện thêm tốc độ.

  2. Hoặc sử dụng định dạng nhị phân .RDS cần có kích thước nhanh hơn và nhỏ hơn do đó nhanh hơn để đọc.

Nếu bạn đang sử dụng .RDS.Rdata thì không có nhiều việc phải làm trong khía cạnh này.

Các vấn đề liên quan