2014-08-27 18 views
7

मैं आर के चमकीले ढांचे का उपयोग करके एक छोटा वेब ऐप चला रहा हूं। उपकरण इतना नहीं करता है। यह सिर्फ यूआई से दिए गए पैरामीटर के साथ डेटा फ्रेम फ़िल्टर कर रहा है। अब मेरे पास समस्या निम्न है। यदि कोई उपयोगकर्ता http के माध्यम से ऐप तक पहुंच रहा है तो ऐप शुरू करने में काफी समय लगता है। चूंकि डेटा, जिसे मैं global.R में लोड करता हूं, काफी बड़ा (~ 5 जीबी) है। प्रारंभिक शुरुआत के बाद, ऐप चिकनी चल रहा है, जब किसी दिए गए समय में पुनः एक्सेस हो रहा है (ऐप कुछ मिनटों के लिए पूरी तरह स्मृति में लगता है)। चूंकि मुझे पर्याप्त मेमोरी उपलब्ध है, और मेरा डेटा उपयोगकर्ता इंटरैक्शन द्वारा नहीं बदला जाता है, इसलिए मैं खुद से पूछ रहा हूं कि क्या मैं पूरी ऐप को स्मृति में रख सकता हूं। क्या यह मजबूर करना संभव है? मेरा सर्वर सेंटोस 6 चला रहा है। इसके अलावा समस्या फाइल सिस्टम, हार्ड डिस्क इत्यादि नहीं है - मैंने डेटा लोड करने के लिए रैम डिस्क बनाई है, लेकिन प्रदर्शन में वृद्धि मामूली है। इसलिए डेटा प्रोसेस करते समय बोतल की गर्दन आर होती है।आर चमकदार मेमोरी एप्लिकेशन या नोएसक्यूएल

अब मुझे दो विचार मिले हैं, जो समस्या को दूर कर सकते हैं।

  • जैसा कि मैंने बताया है, क्या पूरा ऐप स्मृति में रखना संभव है?
  • डेटा को आर ऑब्जेक्ट्स के रूप में सहेजें नहीं, इसके बजाय एक तेज़ नोएसक्यूएल डीबी उदा। Redis wich स्मृति में है

बड़ा डेटा लोड करते समय आप में से एक को कुछ अनुभव हो सकता है। यदि कोई चर्चा हो सकती है तो मैं आभारी रहूंगा। यदि यह संभव है, तो मैं यथासंभव सरल सब कुछ रखने के लिए, रेडिस जैसे बाहरी सॉफ़्टवेयर से बचना चाहता हूं।

सभी बेहतरीन साथ

,

मारियो

उत्तर

0

मैं NoSQL डेटाबेस के साथ कोई अनुभव नहीं है, लेकिन यहाँ कैसे मैं एक Oracle डाटाबेस मेरी क्षुधा में तेजी लाने के साथ चमकदार संयोजन रहा है:

उपयोगकर्ता आदानों एक एसक्यूएल क्वेरी में पारित किया जाता है जो चरम तेज़ डेटाबेस पर भेजा जाता है, और केवल इस क्वेरी का आउटपुट आर में पढ़ा जाता है। कई मामलों में (विशेष रूप से यदि एसक्यूएल में समूह द्वारा बयान शामिल होता है) इससे अवलोकनों की संख्या को पढ़ा जा सकता है कई लाख से कुछ सैकड़ों तक। इसलिए, डेटा लोडिंग बहुत तेज हो जाती है।

नीचे दिए गए उदाहरण में उपयोगकर्ता पहले प्रश्नावली और दिनांक सीमा का चयन करते हैं। यह एक एसक्यूएल स्टेटमेंट उत्पन्न करता है जो प्रासंगिक अवलोकनों को फ़िल्टर करता है और प्रति प्रश्न और प्रश्नावली के उत्तर की आवृत्तियों की गणना करता है। इन आवृत्तियों को आर में पढ़ा जाता है और चमकदार ऐप में एक डाटाटेबल के रूप में प्रदर्शित किया जाता है।

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

आप set the timeout to be a longer value कर सकते हैं। मुझे यकीन नहीं है कि अनंत मूल्य (या लंबे समय तक पर्याप्त मूल्य) संभव है।

अन्य तरीके डेटाबेस को शामिल नहीं किया जा सकता:

  1. उपयोग data.tablefread अगर आप सीएसवी से पढ़ें। यह read.csv से कई गुना तेज हो सकता है। कॉलम कक्षाओं को निर्दिष्ट करें गति को और बेहतर कर सकते हैं।

  2. या बाइनरी प्रारूप .RDS का उपयोग करें जो आकार में तेज़ और छोटा होना चाहिए ताकि इस प्रकार जल्दी पढ़ा जा सके।

आप .RDS.Rdata उपयोग कर रहे हैं पहले से ही वहाँ इस पहलू में करने के लिए बहुत नहीं है।

संबंधित मुद्दे