Re: [問題] 記憶體不足

看板R_Language作者 (誠實可靠小郎君)時間8年前 (2016/06/04 10:35), 編輯推噓5(5036)
留言41則, 3人參與, 最新討論串6/7 (看更多)
因為要打得太多了我想說還是再問一篇好了 我試過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

06/04 14:15, , 1F
你想看的幾個解法https://goo.gl/Q3L6mY pdf p3開始都有
06/04 14:15, 1F

06/04 14:18, , 2F
sqldf csv要靠 library(RH2) csvread in github Q10
06/04 14:18, 2F

06/04 14:18, , 3F
06/04 14:18, 3F

06/04 14:19, , 4F
基本上不管sqldf, bigmemory..都不快,如果新資料格式都
06/04 14:19, 4F

06/04 14:20, , 5F
相同,又有記憶體不夠問題,何不利用系統指令在R外就合併
06/04 14:20, 5F

06/04 14:47, , 6F
不好意思我不太了解要怎麼用系統指令在R外合併,而且我好奇
06/04 14:47, 6F

06/04 14:48, , 7F
的是既然我沒辦法rbind這些資料說是記憶體不足無法寫超過n
06/04 14:48, 7F

06/04 14:49, , 8F
row的資料,那麼我在外面合併不是一樣也讀不進來嗎?
06/04 14:49, 8F

06/04 14:49, , 9F
其實我之前是一次讀全部幾千萬筆的資料,可是每次進來都只
06/04 14:49, 9F

06/04 14:50, , 10F
有900多萬筆(兩次筆數相同),所以我才以為是不是R在讀單次
06/04 14:50, 10F

06/04 14:51, , 11F
的資料列時有限制,我才回分開來讀
06/04 14:51, 11F

06/04 15:00, , 12F
看你目的,如果讀進來只是為了合併,而不做其他運算,那
06/04 15:00, 12F

06/04 15:04, , 13F
不如在R外做如cat 1.csv 2.csv > new.csv (linux)
06/04 15:04, 13F

06/04 15:06, , 14F
如要把超過記憶體的資料讀進來做其他運算,bigmemory這類
06/04 15:06, 14F

06/04 15:07, , 15F
放硬碟的方式有幫助,但bigmemory資料格式必須一致有限制
06/04 15:07, 15F

06/04 15:08, , 16F
如資料會sample or subset後再運算,那資料庫篩完再進R
06/04 15:08, 16F

06/04 15:11, , 17F
如果讀進來少資料,不是記憶體問題,有可能資料格式不整
06/04 15:11, 17F

06/04 15:14, , 18F
另外幾百萬筆,應該fread吃得下來,不妨試試看
06/04 15:14, 18F

06/04 15:26, , 19F
所以cat是linux的語法而fread是C++的語法,可是我剛好都沒
06/04 15:26, 19F

06/04 15:27, , 20F
在使用,我在自己研究一下,非常感謝幫助,之後我應該也會
06/04 15:27, 20F

06/04 15:28, , 21F
開始接觸相關的程式語言,感謝
06/04 15:28, 21F

06/04 15:32, , 22F
先檢查一下妳的資料在9百萬多的列有沒有
06/04 15:32, 22F

06/04 15:32, , 23F
格式錯誤
06/04 15:32, 23F

06/04 15:32, , 24F
No 抱歉造成誤會 是library(data.table)中的fread
06/04 15:32, 24F

06/04 15:33, , 25F
都測測看read.table與read.csv
06/04 15:33, 25F

06/04 15:33, , 26F
兩者在資料出錯時的反應不太一樣
06/04 15:33, 26F

06/04 15:34, , 27F
大資料不要用rbind 盡量一次做完
06/04 15:34, 27F

06/04 15:35, , 28F
rbind會花費額外的記憶體做資料的複製
06/04 15:35, 28F

06/04 16:14, , 29F
照理來說如果資料錯誤的話,不管是900萬筆或者是之後rbind
06/04 16:14, 29F

06/04 16:15, , 30F
的2000萬筆應該都會有相同的問題不是嗎?我的意思是假設我
06/04 16:15, 30F

06/04 16:16, , 31F
一開始全撈只有出現9,251,310筆,那麼我之後by年做rbind不
06/04 16:16, 31F

06/04 16:17, , 32F
是也會在第9,251,310出現錯誤嗎?
06/04 16:17, 32F

06/04 16:17, , 33F
cywhale抱歉我沒有寫清楚,我目前是只有撈到2000多萬筆,之
06/04 16:17, 33F

06/04 16:18, , 34F
後可能每年會以千萬筆的資料量增加,所以我不確定fread吃不
06/04 16:18, 34F

06/04 16:19, , 35F
吃得下,還是感謝你,順便請問一個問題,所以csv檔在linux
06/04 16:19, 35F

06/04 16:19, , 36F
下沒有row的限制嗎?感謝
06/04 16:19, 36F

06/04 18:35, , 37F
沒有
06/04 18:35, 37F

06/13 15:43, , 38F
回報一下進度,剛裝了32G2的記憶體,順利地跑完了2000多萬
06/13 15:43, 38F

06/13 15:44, , 39F
筆,看來之前一次只能抓900多萬應該是因為記憶體無誤,只是
06/13 15:44, 39F

06/13 15:45, , 40F
不知道抓取的筆數跟記憶體的限制在哪,不然之後就算跑完也
06/13 15:45, 40F

06/13 15:45, , 41F
不敢確定跑完的是真的全部資料???
06/13 15:45, 41F
文章代碼(AID): #1NKZwAut (R_Language)
討論串 (同標題文章)
文章代碼(AID): #1NKZwAut (R_Language)