看板 R_Language 關於我們 聯絡資訊
因為要打得太多了我想說還是再問一篇好了 我試過http://goo.gl/soE8XA這篇的方法 可是出現錯誤訊息如下 Loading required package: tcltk Error in .local(conn, name, value, ...) : RS_sqlite_import: data1.dat line 2 expected 2 columns of data but found 3 然後我google了這個錯誤 https://groups.google.com/forum/#!topic/sqldf/1VWgp9WJLr4 這篇有講到14年11月已經修改這個問題了 所以我不知道這樣是發生什麼事了 我還蠻想學會這招的 然後我還想問有關bigmemory跟ff跑起來的速度會比較慢嗎 謝謝 ※ 引述《jklkj (誠實可靠小郎君)》之銘言: : 標題: [問題] 記憶體不足 : 時間: Wed Jun 1 15:53:04 2016 : : : [問題類型]: : 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) : 效能諮詢(我想讓R 跑更快) : : [軟體熟悉度]: : 入門(寫過其他程式,只是對語法不熟悉) : : [問題敘述]: : 目前我要把大概幾千萬筆的資料(目前只跑到2000多萬筆)放進R去, : 應該會有兩三個dataframe,每個dataframe都有數千萬筆 : 打算把R當作資料庫,不管是join或是一些資料的整理 : 我把資料一直rbind下去,超過兩千多萬筆之後就會出現記憶體不足的問題 : 想請問這樣的問題除了直接加記憶體以外(因為是公司的電腦) : 有別的方法嗎? : [程式範例]: : 程式範例就是很簡單的 : sale <- rbind(sale1, sale) : 錯誤訊息如下 : error: cannot allocate vector of size 256.0 mb : 我有找到一些解決的方法是加ram(其實我也很想加到32G)、用64bit(感覺我已經在用了) : 想請問一下有別的解決方法嗎? : : [環境敘述]: : R version 3.3.0 (2016-05-03) -- "Supposedly Educational" : Copyright (C) 2016 The R Foundation for Statistical Computing : Platform: x86_64-w64-mingw32/x64 (64-bit) : : [關鍵字]: : : 記憶體 不足 : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 211.23.167.43 : ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1464767586.A.407.html : → celestialgod: 那麼大的資料量還是直接用資料庫省事 06/01 16:18 : → cywhale: 記得看過用sqldf把檔案當暫時資料庫可以避掉記憶體不足 06/01 16:35 : → jklkj: http://bryannotes.blogspot.tw/2014/07/r-sqldf-vs-lappy. 06/01 17:13 : → jklkj: html 這個網站有看到作者用樓上說的sqldf,而且row數量也相 06/01 17:15 : → jklkj: 當多(應該夠我用一陣子了),想問一下這SQLDF是要怎麼當暫時 06/01 17:16 : → jklkj: 資料庫,感謝 06/01 17:16 : 推 cywhale: 我剛google一下 這篇 http://goo.gl/soE8XA 06/01 17:23 : → cywhale: 我自己沒用過,我也是跟一樓C大說的,直接用資料庫.. 06/01 17:24 : → cywhale: 如果資料都是同一種(如數值)或可以轉換,也可以用 06/01 17:25 : → cywhale: bigmemory in R.. 06/01 17:26 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 211.23.167.43 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1465007754.A.E37.html
cywhale: 你想看的幾個解法https://goo.gl/Q3L6mY pdf p3開始都有 06/04 14:15
cywhale: sqldf csv要靠 library(RH2) csvread in github Q10 06/04 14:18
cywhale: https://goo.gl/b8wWBc 06/04 14:18
cywhale: 基本上不管sqldf, bigmemory..都不快,如果新資料格式都 06/04 14:19
cywhale: 相同,又有記憶體不夠問題,何不利用系統指令在R外就合併 06/04 14:20
jklkj: 不好意思我不太了解要怎麼用系統指令在R外合併,而且我好奇 06/04 14:47
jklkj: 的是既然我沒辦法rbind這些資料說是記憶體不足無法寫超過n 06/04 14:48
jklkj: row的資料,那麼我在外面合併不是一樣也讀不進來嗎? 06/04 14:49
jklkj: 其實我之前是一次讀全部幾千萬筆的資料,可是每次進來都只 06/04 14:49
jklkj: 有900多萬筆(兩次筆數相同),所以我才以為是不是R在讀單次 06/04 14:50
jklkj: 的資料列時有限制,我才回分開來讀 06/04 14:51
cywhale: 看你目的,如果讀進來只是為了合併,而不做其他運算,那 06/04 15:00
cywhale: 不如在R外做如cat 1.csv 2.csv > new.csv (linux) 06/04 15:04
cywhale: 如要把超過記憶體的資料讀進來做其他運算,bigmemory這類 06/04 15:06
cywhale: 放硬碟的方式有幫助,但bigmemory資料格式必須一致有限制 06/04 15:07
cywhale: 如資料會sample or subset後再運算,那資料庫篩完再進R 06/04 15:08
cywhale: 如果讀進來少資料,不是記憶體問題,有可能資料格式不整 06/04 15:11
cywhale: 另外幾百萬筆,應該fread吃得下來,不妨試試看 06/04 15:14
jklkj: 所以cat是linux的語法而fread是C++的語法,可是我剛好都沒 06/04 15:26
jklkj: 在使用,我在自己研究一下,非常感謝幫助,之後我應該也會 06/04 15:27
jklkj: 開始接觸相關的程式語言,感謝 06/04 15:28
Wush978: 先檢查一下妳的資料在9百萬多的列有沒有 06/04 15:32
Wush978: 格式錯誤 06/04 15:32
cywhale: No 抱歉造成誤會 是library(data.table)中的fread 06/04 15:32
Wush978: 都測測看read.table與read.csv 06/04 15:33
Wush978: 兩者在資料出錯時的反應不太一樣 06/04 15:33
Wush978: 大資料不要用rbind 盡量一次做完 06/04 15:34
Wush978: rbind會花費額外的記憶體做資料的複製 06/04 15:35
jklkj: 照理來說如果資料錯誤的話,不管是900萬筆或者是之後rbind 06/04 16:14
jklkj: 的2000萬筆應該都會有相同的問題不是嗎?我的意思是假設我 06/04 16:15
jklkj: 一開始全撈只有出現9,251,310筆,那麼我之後by年做rbind不 06/04 16:16
jklkj: 是也會在第9,251,310出現錯誤嗎? 06/04 16:17
jklkj: cywhale抱歉我沒有寫清楚,我目前是只有撈到2000多萬筆,之 06/04 16:17
jklkj: 後可能每年會以千萬筆的資料量增加,所以我不確定fread吃不 06/04 16:18
jklkj: 吃得下,還是感謝你,順便請問一個問題,所以csv檔在linux 06/04 16:19
jklkj: 下沒有row的限制嗎?感謝 06/04 16:19
Wush978: 沒有 06/04 18:35
jklkj: 回報一下進度,剛裝了32G2的記憶體,順利地跑完了2000多萬 06/13 15:43
jklkj: 筆,看來之前一次只能抓900多萬應該是因為記憶體無誤,只是 06/13 15:44
jklkj: 不知道抓取的筆數跟記憶體的限制在哪,不然之後就算跑完也 06/13 15:45
jklkj: 不敢確定跑完的是真的全部資料??? 06/13 15:45