[問題] shiny讀取大檔案csv會當機

作者: Esmelee (Esme)   2017-10-21 21:42:37
文章分類提示:
- 問題:shiny
[問題類型]:
程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
[軟體熟悉度]:
入門(寫過其他程式,只是對語法不熟悉)
[問題敘述]:
我做了一個shiny讀取歷年資料的程式
可是我的csv檔案有2gb大
發現讀取可以,可是要用shiny+套件時就會當機
如果不用shiny就可以正常繪圖了
有人建議我用mysql可是我把資料弄進mysql,mysql就當機了
檔案太大嗎??只有2g阿
到底要怎麼用才能正常在shiny上跑呢
我的記憶體有16g
我是不是要用甚麼spark hadoop的就會跑得出來
而且後端檔案有2g大網站要怎麼做呢
shinyapps.io好像不可能...
[程式範例]:
library(leaflet)
library(shiny)
library(shinydashboard)
library(readr)
library(methods)
library(DT)
library(RCurl)
alldata_2010 <- read_csv("alldata_test.csv",
col_types = cols(PM2.5 = col_number(),
year = col_character(),
month = col_character(),
day = col_character(),
hour = col_character()))
ui <-
fluidPage(
titlePanel("Basic DataTable"),
fluidRow(
column(4,
selectInput("year",
"year:", alldata_2010, selectize=TRUE)
),
column(4,
selectInput("month",
"month:", alldata_2010, selectize=TRUE)
),
column(4,
selectInput("day",
"day:", alldata_2010, selectize=TRUE)
),
column(4,
selectInput("hour",
"hour:", alldata_2010, selectize=TRUE)
),
fluidRow(
title = "data MAP",
collapsible = TRUE,
width = "100%",
height = "100%",
leafletOutput("datamap", height = "900px")
)
)
)
server <-
function(input, output) {
output$datamap <- renderLeaflet({
data <- alldata_2010
if (input$year != "all") {
data <- data[data$year == input$year,]
}
if (input$month != "All") {
data <- data[data$month == input$month,]
}
if (input$day != "All") {
data <- data[data$day == input$day,]
}
if (input$hour != "All") {
data <- data[data$hour == input$hour,]
}
cPal <- colorNumeric(palette =
c("green","orange","red","purple"),domain = 0:100)
leaflet(taiwan) %>%addProviderTiles(providers$CartoDB.Positron) %>%
addPolygons(color = "#444444", weight = 1.5, smoothFactor = 1.5,
opacity = 1.5, fillOpacity = 0.1) %>%
addCircleMarkers(lng=data$TWD97Lon,lat=data$TWD97Lat,
radius=13,stroke=FALSE, fillOpacity = 0.9,
fillColor = ~cPal(data$PM2.5),
label =~as.character(data$PM2.5),
popup = ~as.character(data$site))%>%
addLegend("bottomright", pal = cPal, values =data$PM2.5,title =
"PM2.5",
labFormat = labelFormat(suffix = " "),opacity = 1)
}
)
}
shinyApp(ui = ui, server = server)
[環境敘述]:
R version 3.3.3
windows 10
記憶體16gb
[關鍵字]:shiny 資料大
作者: celestialgod (天)   2017-10-21 21:55:00
你有打算自己架shiny server嗎另外 mysql不可能存2GB就死了...最好的架構應該是直接架一台linux server用MariaDB存資料,需要的資料在撈出來畫圖就好
作者: Esmelee (Esme)   2017-10-21 22:03:00
要怎麼自己架server,我還在研究請問就是直接架一台linux server就不會造成當機了嗎
作者: celestialgod (天)   2017-10-21 22:06:00
Windows的application 我是比較不信他XD
作者: Esmelee (Esme)   2017-10-21 22:06:00
我目前光挑選csv中的資料就會很慢
作者: Esmelee (Esme)   2017-10-21 22:07:00
我家電腦沒有linux. 哭
作者: celestialgod (天)   2017-10-21 22:07:00
csv資料篩選可以用data.table套件加速 設keys看你到底是什麼用途...我只是推一個最好的架構 並非一定要那樣做
作者: Esmelee (Esme)   2017-10-21 22:13:00
這程式就是選擇幾年幾日幾時的數據,有二十年之長,如果弄成一個月是沒問題,但我很需要長的資料啊
作者: celestialgod (天)   2017-10-21 22:15:00
資料庫是最好的選擇你不如去請教為什麼MySQL會死可能比較快XD
作者: Esmelee (Esme)   2017-10-21 22:16:00
我再看看mysql好了,如果shiny跟mysql做連結,會不會跑的比較快?
作者: celestialgod (天)   2017-10-21 22:17:00
mysql建好table要記得給index應該就沒問題了我好像看出來你為什麼單純2GB資料記憶體就吃不消的問題了...我回個文好了
作者: HumuHumu (呼姆呼姆)   2017-10-21 23:01:00
我有整理架設shiny server的流程 站內你
作者: Esmelee (Esme)   2017-10-22 00:06:00
謝謝大大了,我會再研究看看
作者: bluecadence (Maxwell's demon)   2017-10-22 12:44:00
你的作業系統是 32- or 64-bit? 你的 R 執行檔是 32-or 64-bit build?
作者: Esmelee (Esme)   2017-10-22 12:55:00
Platform: x86_64-w64-mingw32/x64 (64-bit)所以應該是64 ?
作者: bluecadence (Maxwell's demon)   2017-10-22 13:11:00
你這應該還是windows作業系統的問題,你可以看一下https://stat.ethz.ch/R-manual/R-devel/library/base/html/Memory-limits.html (抱歉沒縮網址)雖然OS和Apps都是64 bit 但是底下有一句話"It is not normally possible to allocate as muchas 2Gb to a single vector in a 32-bit build of R
作者: Esmelee (Esme)   2017-10-22 13:15:00
修改過memory.limit造成windows當機,我等等上傳csv
作者: bluecadence (Maxwell's demon)   2017-10-22 13:15:00
... 貼到一半我發現我看錯了..原則上 64-bit Apps on 64-bit OS 應該沒問題..但你的錯誤訊息 cannot allocate vector of size ...看起來是 OS 不給memory還要再要 93 MB 的時候失敗了
作者: Esmelee (Esme)   2017-10-22 13:31:00
csv 下載 https://goo.gl/R1yvKs有沒有不需要記憶體的方法阿
作者: bluecadence (Maxwell's demon)   2017-10-22 13:52:00
"cannot allocate vector of size N" 指的是不能繼續取得"連續的"記憶體區塊
作者: Esmelee (Esme)   2017-10-22 15:35:00
我把二十年改成十年就可以讀取了!
作者: celestialgod (天)   2017-10-22 20:16:00
滿好奇原PO資料是幾個欄位,共有幾個row?
作者: cywhale (cywhale)   2017-10-23 13:44:00
2gb應該不會是data.table or SQL的阻礙.如果檔案只查不改也可以做前處理,自己依欄位屬性切成較小的檔案..如果欄位屬性不複雜 也可以考慮bigmemory #1NaPhu9c不過以文中看來,用成關聯資料庫 取出資料應該最直接,,,
作者: Esmelee (Esme)   2017-10-24 22:41:00
我會再研究sql的,謝謝大家熱心幫忙

Links booklink

Contact Us: admin [ a t ] ucptt.com