1. 程式人生 > >R語言高性能編程(三)

R語言高性能編程(三)

一點 sco 冗余 情況 avr 並行 受限 pivotal 誤差

一、使用並行計算加倍提升性能
1、數據並行 VS 任務並行
實現數據並行的算法
scoket 並行性
註意並行計算時間並不與執行任務的計算資源數目成正比(計算機核心),amdahl定律:並行代碼的速度受限於串行執行的部分,包括並行性帶來的開銷
在非windows系統中,parallel支持分叉集群(交叉法),新的work進程會從父R進程分叉出來,並拷貝數據。好處是不需要顯示的創建和銷毀集群
實現任務並行的算法

2、計算機集群並行執行多個任務
只有基於socket的集群可以做到這一點,因為進程不可能被分叉到另外一臺機器。由於計算機集群必須通過網絡通信,所以網絡的帶寬和延遲對整個集群的性能
非常重要。所以在多個物理機的情況下 ,應該把所有節點部署在同一個網段內更合理

3、共享內存並行性 VS 分布式內存並行性
分布式內存並行性中 每個進程都有自己堵路的內存空間,換句話說,每個進程都要有自己的數據拷貝,即使這些進程處理的是相同的數據。
這樣的話在單個計算機的多個進程運行並行代碼,這會導致極大的冗余。交叉集群沒這個問題,socker集群,創建了新的R實例,所以每個worker都有數據拷貝。

共享內存並行性 所有的worker進程共享單份數據拷貝。雖然parallel 包不支持共享內存並行性,但是可以通過調整數據結構來支持,bigmemory中的big.matrix對象的cran包
一定要註意避免競爭條件,即worker進程讀寫相同內存位置,由於協調不當導致沖突和程序錯誤。

4、優化並行的可能
主要障礙就是master和worker之間的數據傳遞和拷貝。
1、就是使用共享內存並行性
2、數據壓縮
3、將數據保存在每個worker節點,只保留中間節點的數據通信 類似於MR

二、將數據處理交給數據庫系統
一個很大的數據集存儲在數據庫中,將所有的數據抽取到R裏面是不現實的
1、將數據抽取到R VS 在數據庫中處理數據
從關系型數據庫中使用sql進行數據預處理
dplyr 和 pivotalR 可以將R表達式轉化為SQL
2、在數據庫中運行統計和機器學習算法
madlib 想postgresql 添加了高級統計功能,不支持windows,只需一個簡單的數據庫規則,即可在數據庫端計算,將計算結果加載到windows
3、使用列式數據庫提升性能
這種方式目前並不太適合我們的業務
4、使用數據庫陣列最大化科學計算的性能
針對多維模型是運用

三、展開聯想,R和大數據
HDFS 存儲數據,按塊存儲(128M),默認3個副本,保證了高度可用性
MR 數據並行的方式處理hdfs上的數據,和第八點很像,但是MR的優勢是數據已經存儲在worker節點上而不需要每次運行任務的時候分發
但是,每次讀取需要從硬盤獲取數據,然後在寫回磁盤。所以完成計算時間超過了讀寫數據的開銷以及運行hadoop集群的開銷。
具體不在細說,因為大數據的生態體系已經很大了,不是一個人一兩天可以說清楚的。

使用Rhadoop分析HDFS數據
使用rmr2函數讀取文件make.input.format(),還可以讀取原生文本,json,hadoop序列化文件,hbase我,hive,pig。
除了rhdfs和rmr2外,還有
plyrmr:mr上的plyr功能
rhbase:提供處理rhbase數據的函數
ravro:讀寫avro格式的數據

到這裏已經全部介紹完了高性能編程的核心知識。

關於海量數據,在R無論如何優化也R滿足不了的情況,比如針對我們的業務 高考單卷種500W 考生 單科目 * 100個小題 5億離線數據量 ,再加上歷次共有幾十億數據量。

這時個人覺得再用R優化,增加硬件性能也是指標不治本的情況,上大數據吧,我們應該形成自己的數據倉庫,存放歷史數據,形成產品,這樣才能做大,做強!

PS:當時選用R就是為了解決像DIF、信度、測量標準誤差、相關系數等方面的算法問題,拋棄R,如何解決算法問題呢。在算法不能拆分的情況下,如何分布式計算相關系數?

sparkR? 還有別的什麽辦法嗎?

R語言高性能編程(三)