Re: [問題] 記憶體不足

作者: jklkj (誠實可靠小郎君)   2016-06-04 10:35:50
因為要打得太多了我想說還是再問一篇好了
我試過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)
作者: cywhale (cywhale)   2016-06-04 14:15:00
你想看的幾個解法https://goo.gl/Q3L6mY pdf p3開始都有sqldf csv要靠 library(RH2) csvread in github Q10https://goo.gl/b8wWBc基本上不管sqldf, bigmemory..都不快,如果新資料格式都相同,又有記憶體不夠問題,何不利用系統指令在R外就合併
作者: jklkj (誠實可靠小郎君)   2016-06-04 14:47:00
不好意思我不太了解要怎麼用系統指令在R外合併,而且我好奇的是既然我沒辦法rbind這些資料說是記憶體不足無法寫超過nrow的資料,那麼我在外面合併不是一樣也讀不進來嗎?其實我之前是一次讀全部幾千萬筆的資料,可是每次進來都只有900多萬筆(兩次筆數相同),所以我才以為是不是R在讀單次的資料列時有限制,我才回分開來讀
作者: cywhale (cywhale)   2016-06-04 15:00:00
看你目的,如果讀進來只是為了合併,而不做其他運算,那不如在R外做如cat 1.csv 2.csv > new.csv (linux)如要把超過記憶體的資料讀進來做其他運算,bigmemory這類放硬碟的方式有幫助,但bigmemory資料格式必須一致有限制如資料會sample or subset後再運算,那資料庫篩完再進R如果讀進來少資料,不是記憶體問題,有可能資料格式不整另外幾百萬筆,應該fread吃得下來,不妨試試看
作者: jklkj (誠實可靠小郎君)   2016-06-04 15:26:00
所以cat是linux的語法而fread是C++的語法,可是我剛好都沒在使用,我在自己研究一下,非常感謝幫助,之後我應該也會開始接觸相關的程式語言,感謝
作者: Wush978 (拒看低質媒體)   2016-06-04 15:32:00
先檢查一下妳的資料在9百萬多的列有沒有格式錯誤
作者: cywhale (cywhale)   2016-06-04 15:32:00
No 抱歉造成誤會 是library(data.table)中的fread
作者: Wush978 (拒看低質媒體)   2016-06-04 15:33:00
都測測看read.table與read.csv兩者在資料出錯時的反應不太一樣大資料不要用rbind 盡量一次做完rbind會花費額外的記憶體做資料的複製
作者: jklkj (誠實可靠小郎君)   2016-06-04 16:14:00
照理來說如果資料錯誤的話,不管是900萬筆或者是之後rbind的2000萬筆應該都會有相同的問題不是嗎?我的意思是假設我一開始全撈只有出現9,251,310筆,那麼我之後by年做rbind不是也會在第9,251,310出現錯誤嗎?cywhale抱歉我沒有寫清楚,我目前是只有撈到2000多萬筆,之後可能每年會以千萬筆的資料量增加,所以我不確定fread吃不吃得下,還是感謝你,順便請問一個問題,所以csv檔在linux下沒有row的限制嗎?感謝
作者: Wush978 (拒看低質媒體)   2016-06-04 18:35:00
沒有
作者: jklkj (誠實可靠小郎君)   2016-06-13 15:43:00
回報一下進度,剛裝了32G2的記憶體,順利地跑完了2000多萬筆,看來之前一次只能抓900多萬應該是因為記憶體無誤,只是不知道抓取的筆數跟記憶體的限制在哪,不然之後就算跑完也不敢確定跑完的是真的全部資料???

Links booklink

Contact Us: admin [ a t ] ucptt.com