精華區beta R_Language 關於我們 聯絡資訊
- 問題: 當你想要問問題時,請使用這個類別。 建議先到 http://tinyurl.com/mnerchs 搜尋本板舊文。 [問題類型]: 效能諮詢(我想讓R 跑更快) [軟體熟悉度]: 請把以下不需要的部份刪除 入門(寫過其他程式,只是對語法不熟悉) [問題敘述]: 請簡略描述你所要做的事情,或是這個程式的目的 我有一個約千萬筆的產品交易紀錄 格式長得像下面這樣子 #testdata customerid:AAAAAAAAAA payment:BBBBBBBB ReadTime:CCCCCC 20170419020204PruductNumber:DDDDDD:NT00183.1415Number:40 20170419020205PruductNumber:EEEEEE:NT00184.1415Number:42 20170419020206PruductNumber:FFFFFF:NT00185.1415Number:44 客戶:GGGGGGGGGGG 付款方式:III 讀取時間:JJJJJJ 20170419020204PruductNumber:KKKKKK:NT00040.1610Number:40 20170419020205PruductNumber:EEEEEE:NT00041.1610Number:42 20170419020206PruductNumber:FFFFFF:NT00042.1610Number:44 20170419020207PruductNumber:HHHHHH:NT00043.1610Number:46 我想要整理成 客戶 付款方式 讀取時間 交易時間 產品序號 金額 數量 AAAAAAAAAAA BBBBBB CCCCCC 20170419020204 DDDDDD 00183.1415 40 AAAAAAAAAAA BBBBBB CCCCCC 20170419020205 EEEEEE 00184.1415 42 AAAAAAAAAAA BBBBBB CCCCCC 20170419020206 FFFFFF 00185.1415 44 GGGGGGGGGGG III JJJJJJ 20170419020204 KKKKKK 00040.1610 40 GGGGGGGGGGG III JJJJJJ 20170419020205 EEEEEE 00041.1610 42 GGGGGGGGGGG III JJJJJJ 20170419020206 FFFFFF 00042.1610 44 GGGGGGGGGGG III JJJJJJ 20170419020207 HHHHHH 00043.1610 46 目前程式的雛型是讀入data後用for迴圈跟if和substr判定關鍵字, 再用substr寫入各變數後,利用rbind結合變數輸出。 但是碰到的問題是利用測試資料試跑時(約10000筆)就碰上了效能不佳的問題, 真實資料約1000萬筆,請問有無處理此類資料的套件或是效能較佳的解法呢? 感謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.25.9.219 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1492585376.A.957.html
Wush978: 這種高效能的非結構化資料,只能運用hadoop/spark的map- 04/19 16:42
Wush978: reduce來做了 04/19 16:42
Wush978: 「需要高效能的整理非結構化資料的功能」<--我第一句是要 04/19 16:43
Wush978: 打這個 04/19 16:43
f496328mm: 資料大約幾GB? 可以試試看用sapply取代for 04/19 17:03
f496328mm: 然後再用snow平行去加速 04/19 17:03
f496328mm: 這算是比較折衷的方法 04/19 17:04
obarisk: c/c++ 04/19 17:15
fox1375: 試試Microsoft R Open? 04/19 20:00
> -------------------------------------------------------------------------- < 作者: celestialgod (天) 看板: R_Language 標題: Re: [問題] 以r整理大量資料,效能問題 時間: Wed Apr 19 20:19:16 2017 ※ 引述《kial (夏澄)》之銘言: : : - 問題: 當你想要問問題時,請使用這個類別。 : 建議先到 http://tinyurl.com/mnerchs 搜尋本板舊文。 : : [問題類型]: : : 效能諮詢(我想讓R 跑更快) : : [軟體熟悉度]: : 請把以下不需要的部份刪除 : 入門(寫過其他程式,只是對語法不熟悉) : [問題敘述]: : 請簡略描述你所要做的事情,或是這個程式的目的 : 我有一個約千萬筆的產品交易紀錄 : 格式長得像下面這樣子 : #testdata : customerid:AAAAAAAAAA : payment:BBBBBBBB : ReadTime:CCCCCC : 20170419020204PruductNumber:DDDDDD:NT00183.1415Number:40 : 20170419020205PruductNumber:EEEEEE:NT00184.1415Number:42 : 20170419020206PruductNumber:FFFFFF:NT00185.1415Number:44 : 客戶:GGGGGGGGGGG : 付款方式:III : 讀取時間:JJJJJJ : 20170419020204PruductNumber:KKKKKK:NT00040.1610Number:40 : 20170419020205PruductNumber:EEEEEE:NT00041.1610Number:42 : 20170419020206PruductNumber:FFFFFF:NT00042.1610Number:44 : 20170419020207PruductNumber:HHHHHH:NT00043.1610Number:46 : 我想要整理成 : 客戶 付款方式 讀取時間 交易時間 產品序號 金額 數量 : AAAAAAAAAAA BBBBBB CCCCCC 20170419020204 DDDDDD 00183.1415 40 : AAAAAAAAAAA BBBBBB CCCCCC 20170419020205 EEEEEE 00184.1415 42 : AAAAAAAAAAA BBBBBB CCCCCC 20170419020206 FFFFFF 00185.1415 44 : GGGGGGGGGGG III JJJJJJ 20170419020204 KKKKKK 00040.1610 40 : GGGGGGGGGGG III JJJJJJ 20170419020205 EEEEEE 00041.1610 42 : GGGGGGGGGGG III JJJJJJ 20170419020206 FFFFFF 00042.1610 44 : GGGGGGGGGGG III JJJJJJ 20170419020207 HHHHHH 00043.1610 46 : 目前程式的雛型是讀入data後用for迴圈跟if和substr判定關鍵字, : 再用substr寫入各變數後,利用rbind結合變數輸出。 : 但是碰到的問題是利用測試資料試跑時(約10000筆)就碰上了效能不佳的問題, : 真實資料約1000萬筆,請問有無處理此類資料的套件或是效能較佳的解法呢? : 感謝。 程式:https://pastebin.com/idYqA03T 說明如下: 我不知道你的data source如何 我先假設你的資料是單一檔案 如果你記憶體不能全部吃下,就分段執行 只是要記得可能會斷在中間,這部分要額外再處理,但這裡就不談 data generation的部分,我就略過 其實你的資料滿好parse的,所以只要抓對區塊 然後再分成基本資訊跟消費物品就處理完了 因為我沒亂排基本資訊的三個欄位 所以我只是很單純去抓customerid這個欄位的位置 然後做個cumsum當作split的vector即可 parsing部分,基本資訊就用regexp: (customerid|payment|ReadTime): (.*) 配合stringr::str_match,把基本資訊抓出來 然後再用match調到對的地方 (我data生成,沒有打亂順序,所以其實不用這個步驟) 再來明細部分就用這個regexp: (\\d{14})PruductNumber: ([a-zA-Z0-9]+): NT(\\d{5}\\.\\d{4})Number: (\\d+) 第一個小括號抓出日期,第二個抓PruductNumber,第三個抓價錢,第四個抓數量 抓下來之後,str_match取最後四行就是我們要的四個欄位了 最後整併成data.table就完工了 這樣做下來,我電腦CPU是i7-3770K,八個執行緒,我用七個跑 只需要16.86秒就處理完一萬筆record了 一千萬的話,可能大概要16860秒,也就是4.68小時... 除非你有更強的電腦,擁有更多的thread 或是使用多台電腦(用makeCluster可以多台多個thread跑) 不然你想要在短時間內用R處理完可能還滿難的.... 系統資訊:作業系統是windows 10, Microsoft R Open 3.3.3 Note: 要注意matrix取出一行或是一列時,R會把dimension drop掉,變成vector 所以記得補上一個drop = TRUE讓他永遠是matrix,這樣輸入data.table/data.frame 才會是數個column -- R資料整理套件系列文: magrittr #1LhSWhpH (R_Language) https://goo.gl/72l1m9 data.table #1LhW7Tvj (R_Language) https://goo.gl/PZa6Ue dplyr(上.下) #1LhpJCfB,#1Lhw8b-s (R_Language) https://goo.gl/I5xX9b tidyr #1Liqls1R (R_Language) https://goo.gl/i7yzAz pipeR #1NXESRm5 (R_Language) https://goo.gl/zRUISx -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.233.82.29 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1492604363.A.DAB.html
kial: 感謝提供思路,我會自已試試修改成我的東西,到時再分享 04/19 21:00
kial: makeCluster平行處理,foreach取代for,然後用stringr處理字 04/19 21:39
kial: 串。思考過程是這樣的嗎? 04/19 21:40
是,別忘了iterators::isplit,讓資料傳輸量變少,平行會比較有效率 而且也不用真的去切資料,用記憶體去儲存一個很大的list ※ 編輯: celestialgod (36.233.82.29), 04/19/2017 21:46:32
a78998042a: 推 04/21 01:29