您好,登錄后才能下訂單哦!
小編給大家分享一下R語言如何解決處理矩陣遇到內存不足的問題,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
R語言是用于統計分析、繪圖的語言和操作環境,屬于GNU系統的一個自由、免費、源代碼開放的軟件,它是一個用于統計計算和統計制圖的優秀工具。
如下:
Error : cannot allocate vector of size X Gb
1. 可以用matrix盡量不要用data frame;
2. 可以用integer matrix盡量不要用 double matrix;
3. 對于大量運算后最好加上一個gc(), 強制R語言回收內存;
4. 對于大矩陣而言用bigmemory包,可以將大矩陣放到臨時文件中,不占用內存。
補充:R語言之內存管理
在處理大型數據過程中,R語言的內存管理就顯得十分重要,以下介紹幾種常用的處理方法。
memory.size(2048) #設置內存大小 memory.size(NA) #查看當前設置下最大內存 #or memory.limit() memory.size(F) #查看當前已使用的內存 #or library(pryr) mem_used() mem_change(x <- 1:1e6) #查看執行命令時內存的變化 memory.size(T) #查看已分配的內存
注意剛開始時已使用內存和已分配內存是同步增加的,但是隨著R中的垃圾被清理,已使用內存會減少,而已分配給R的內存一般不會改變。
R中的對象在內存中存于兩種不同的地方,一種是堆內存(heap),其基本單元是“Vcells”,每個大小為8字節,新來一個對象就會申請一塊空間,把值全部存在這里,和C里面的堆內存很像。第二種是地址對(cons cells),和LISP里的cons cells道理一樣,主要用來存儲地址信息,最小單元一般在32位系統中是28字節、64位系統中是56字節。
ls() #查看當前對象 object.size() 查看對象所占內存 #or library(pryr) object_size() #區別于前者,它進行了換算
R會將新的對象存儲在“連續”的內存中,如果沒有這樣的空間就會返回“Cannot allocate vector of size...” 的錯誤,有以下幾種處理方法:
a) 如果有多個矩陣需要存儲,確保優先存儲較大的矩陣,然后依次存儲較小的矩陣.
b) 預先分配合適的內存.
大家都知道R中矩陣的維度并不需要賦一個固定的值(很多語言的數組長度不能為變量),這為寫程序帶來了極大的方便,因此經常在循環中會出現某個矩陣越來越長的情況,實際上,矩陣每增長一次,即使賦給同名的變量,都需要新開辟一塊更大的空間,假設初始矩陣為100K,第二個為101K,一直增到120K,那么,將會分別開辟100K、101K一直到120K的連續堆內存,如果一開始就開一塊120K的,使之從101K逐漸增長到120K,將會大大地節約內存。cbind函數也是這個道理,所以在循環中要注意不要濫用。
c) 換到64位的計算機,這種問題較少出現.
例如某個矩陣默認就是"double"的,如果這個矩陣的數值都是整數甚至0-1,完全沒必要使用double來占用空間,可以將其改為整數型,可以看到該對象的大小會變為原來的一半。
storage.mode(x) #查看對象的存儲模式 storage.mode(x) <- "integer" #整數型存儲模式
rm() #刪除變量的引用,經常用它來清理中間對象,其中比較重要的文件可以存在硬盤里,比如csv文件或者RSqlite等
gc() #清理內存空間
.ls.objects() #查看內存消耗較大的文件,并處理掉其他無關對象.代碼如下:
.ls.objects <- function (pos = 1, pattern, order.by = "Size", decreasing=TRUE, head = TRUE, n = 10) { napply <- function(names, fn) sapply(names, function(x) fn(get(x, pos = pos))) names <- ls(pos = pos, pattern = pattern) obj.class <- napply(names, function(x) as.character(class(x))[1]) obj.mode <- napply(names, mode) obj.type <- ifelse(is.na(obj.class), obj.mode, obj.class) obj.size <- napply(names, object.size) / 10^6 # megabytes obj.dim <- t(napply(names, function(x) as.numeric(dim(x))[1:2])) vec <- is.na(obj.dim)[, 1] & (obj.type != "function") obj.dim[vec, 1] <- napply(names, length)[vec] out <- data.frame(obj.type, obj.size, obj.dim) names(out) <- c("Type", "Size", "Rows", "Columns") out <- out[order(out[[order.by]], decreasing=decreasing), ] if (head) out <- head(out, n) out }
這部分可參考文獻1。在xp系統上試了一下,得到的存儲地址總是不變,不知道xp系統上有沒有效...
這是沒有辦法的辦法,遲早要處理全部的數據,不過可以借此調試代碼或是建模,如在合適的地方清理中間對象
Hadley Wickham 建議寫成腳本文件,運行后再清理掉臨時文件
它可以將特定對象存儲為RData文件并無需加載到內存就能進行分析
r = data.frame(a=rnorm(10,2,.5),b=rnorm(10,3,.5)) library(SOAR) Sys.setenv(R_LOCAL_CACHE=”testsession”) ls() Store(r) ls() mean(r[,1]) r$c = rnorm(10,4,.5) ls()
它會告訴你哪一行的代碼消耗了多少時間、內存,釋放多少內存,復制了多少向量.
library(devtools) devtools::install_github("hadley/lineprof") library(lineprof) source("D:/test/test.R") prof <- lineprof(test("D:/test/testcsv")) shine(prof)
以上是“R語言如何解決處理矩陣遇到內存不足的問題”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。