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

R語言高性能編程(二)

按值傳遞 spa matrix 算法 內存映射文件 mem 返回 閾值 gic

接著上一篇

一、減少內存使用的簡單方法
1、重用對象而不多占用內存 y <- x 是指新變量y指向包含X的那個內存塊,只有當y被修改時才會復制到新的內存塊,
一般來說只要向量沒有被其他對象引用,就可以正常修改,以避免復制向量帶來的CPU和RAM開銷。按照程序屬於來說,R是按值傳遞,
應該避免使用sort 類似的函數,會返回一個副本,資源開銷至少和原對象一樣大,甚至更大
2、刪除不在需要的中間數據
註意 在調用rm()的時候,內存不會被立即釋放並交還到操作系統,而是在必要的時候,或者當已刪除對象的內存量超過閾值的時候,
由R的垃圾回收器自動釋放內存
3、運行時計算值而不是永久性存儲值
4、交換活躍數據和非活躍數據 將一些數據保存到磁盤,saveRDSP readRDS

二、使用有限內存處理大型數據集
1、使用節約內存的數據結構
R存儲數據結構的方式? 對所有數據類型來說,向量是最基本的結構單元,提供了多種原子向量類型(logic,integer,numeric,complex,character,raw)
很多其他數據結構都可以從這些向量類型構建,R內部存儲結構的本質就是向量
2、稀疏矩陣 包含大量的零值或者空值 sparse參數
3、對稱矩陣 dspmatrix
4、比特向量 R中的邏輯值占4個字節或32個比特位,而比特向量僅用一個比特位存儲每個邏輯值。減少32倍,但是不適合存儲NA值(bit包)
5、使用內存映射文件並以塊的形式處理數據 數據不管怎麽優化 大到放不進內存中的時候 就需要以memory -mapped file 的形式存儲到磁盤
分塊計算 ,然後合並結構,是否容易實現 取決於算法本身
bigmemory big.matrix 支持很多R矩陣上的操作 支持big.matrix對象的cran包 biganalytics bigtabulate
ff 和 ffbase 已做過簡單的數據測試 本機16G 內存 I7700的U 可支持2億數據量的 分塊計算 是一個很考驗算法的難題

--------------------截止到這裏 我們已經學習了串行R代碼的各種優化,下面介紹利用CPU多核 並行計算

未完待續.....

R語言高性能編程(二)