R語(yǔ)言-解決處理矩陣遇到內(nèi)存不足的問(wèn)題
如下:
Error : cannot allocate vector of size X Gb
類似于這種問(wèn)題的可能處理辦法:
1. 可以用matrix盡量不要用data frame;
2. 可以用integer matrix盡量不要用 double matrix;
3. 對(duì)于大量運(yùn)算后最好加上一個(gè)gc(), 強(qiáng)制R語(yǔ)言回收內(nèi)存;
4. 對(duì)于大矩陣而言用bigmemory包,可以將大矩陣放到臨時(shí)文件中,不占用內(nèi)存。
補(bǔ)充:R語(yǔ)言之內(nèi)存管理
在處理大型數(shù)據(jù)過(guò)程中,R語(yǔ)言的內(nèi)存管理就顯得十分重要,以下介紹幾種常用的處理方法。
1,設(shè)置軟件的內(nèi)存
memory.size(2048) #設(shè)置內(nèi)存大小 memory.size(NA) #查看當(dāng)前設(shè)置下最大內(nèi)存 #or memory.limit() memory.size(F) #查看當(dāng)前已使用的內(nèi)存 #or library(pryr) mem_used() mem_change(x <- 1:1e6) #查看執(zhí)行命令時(shí)內(nèi)存的變化 memory.size(T) #查看已分配的內(nèi)存
注意剛開(kāi)始時(shí)已使用內(nèi)存和已分配內(nèi)存是同步增加的,但是隨著R中的垃圾被清理,已使用內(nèi)存會(huì)減少,而已分配給R的內(nèi)存一般不會(huì)改變。
2,對(duì)象的存儲(chǔ)
R中的對(duì)象在內(nèi)存中存于兩種不同的地方,一種是堆內(nèi)存(heap),其基本單元是“Vcells”,每個(gè)大小為8字節(jié),新來(lái)一個(gè)對(duì)象就會(huì)申請(qǐng)一塊空間,把值全部存在這里,和C里面的堆內(nèi)存很像。第二種是地址對(duì)(cons cells),和LISP里的cons cells道理一樣,主要用來(lái)存儲(chǔ)地址信息,最小單元一般在32位系統(tǒng)中是28字節(jié)、64位系統(tǒng)中是56字節(jié)。
ls() #查看當(dāng)前對(duì)象 object.size() 查看對(duì)象所占內(nèi)存 #or library(pryr) object_size() #區(qū)別于前者,它進(jìn)行了換算
1) 新建對(duì)象分配合適的內(nèi)存
R會(huì)將新的對(duì)象存儲(chǔ)在“連續(xù)”的內(nèi)存中,如果沒(méi)有這樣的空間就會(huì)返回“Cannot allocate vector of size...” 的錯(cuò)誤,有以下幾種處理方法:
a) 如果有多個(gè)矩陣需要存儲(chǔ),確保優(yōu)先存儲(chǔ)較大的矩陣,然后依次存儲(chǔ)較小的矩陣.
b) 預(yù)先分配合適的內(nèi)存.
大家都知道R中矩陣的維度并不需要賦一個(gè)固定的值(很多語(yǔ)言的數(shù)組長(zhǎng)度不能為變量),這為寫程序帶來(lái)了極大的方便,因此經(jīng)常在循環(huán)中會(huì)出現(xiàn)某個(gè)矩陣越來(lái)越長(zhǎng)的情況,實(shí)際上,矩陣每增長(zhǎng)一次,即使賦給同名的變量,都需要新開(kāi)辟一塊更大的空間,假設(shè)初始矩陣為100K,第二個(gè)為101K,一直增到120K,那么,將會(huì)分別開(kāi)辟100K、101K一直到120K的連續(xù)堆內(nèi)存,如果一開(kāi)始就開(kāi)一塊120K的,使之從101K逐漸增長(zhǎng)到120K,將會(huì)大大地節(jié)約內(nèi)存。cbind函數(shù)也是這個(gè)道理,所以在循環(huán)中要注意不要濫用。
c) 換到64位的計(jì)算機(jī),這種問(wèn)題較少出現(xiàn).
2) 改變當(dāng)前對(duì)象的存儲(chǔ)模式
例如某個(gè)矩陣默認(rèn)就是"double"的,如果這個(gè)矩陣的數(shù)值都是整數(shù)甚至0-1,完全沒(méi)必要使用double來(lái)占用空間,可以將其改為整數(shù)型,可以看到該對(duì)象的大小會(huì)變?yōu)樵瓉?lái)的一半。
storage.mode(x) #查看對(duì)象的存儲(chǔ)模式 storage.mode(x) <- "integer" #整數(shù)型存儲(chǔ)模式
3) 清理中間對(duì)象
rm() #刪除變量的引用,經(jīng)常用它來(lái)清理中間對(duì)象,其中比較重要的文件可以存在硬盤里,比如csv文件或者RSqlite等
gc() #清理內(nèi)存空間
4) 清理其他對(duì)象
.ls.objects() #查看內(nèi)存消耗較大的文件,并處理掉其他無(wú)關(guān)對(duì)象.代碼如下:
.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
}
3,修改存儲(chǔ)地址
這部分可參考文獻(xiàn)1。在xp系統(tǒng)上試了一下,得到的存儲(chǔ)地址總是不變,不知道xp系統(tǒng)上有沒(méi)有效...
4,選取數(shù)據(jù)集的子集
這是沒(méi)有辦法的辦法,遲早要處理全部的數(shù)據(jù),不過(guò)可以借此調(diào)試代碼或是建模,如在合適的地方清理中間對(duì)象
5,寫成腳本文件
Hadley Wickham 建議寫成腳本文件,運(yùn)行后再清理掉臨時(shí)文件
6,使用SOAR包
它可以將特定對(duì)象存儲(chǔ)為RData文件并無(wú)需加載到內(nèi)存就能進(jìn)行分析
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()
7,一個(gè)有趣的函數(shù)
它會(huì)告訴你哪一行的代碼消耗了多少時(shí)間、內(nèi)存,釋放多少內(nèi)存,復(fù)制了多少向量.
library(devtools)
devtools::install_github("hadley/lineprof")
library(lineprof)
source("D:/test/test.R")
prof <- lineprof(test("D:/test/testcsv"))
shine(prof)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
R語(yǔ)言實(shí)現(xiàn)支持向量機(jī)SVM應(yīng)用案例
本文主要介紹了R語(yǔ)言實(shí)現(xiàn)支持向量機(jī)SVM應(yīng)用案例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
R語(yǔ)言基于Keras的MLP神經(jīng)網(wǎng)絡(luò)及環(huán)境搭建
這篇文章主要介紹了R語(yǔ)言基于Keras的MLP神經(jīng)網(wǎng)絡(luò),我并沒(méi)有使用python去對(duì)比結(jié)果,但NSS的文章中有做對(duì)比,數(shù)據(jù)顯示R與Python相比在各方面的差別都不大,具體內(nèi)容介紹跟隨小編一起看看吧2022-01-01
R語(yǔ)言運(yùn)算符知識(shí)點(diǎn)講解
在本篇文章里小編給大家分享了一篇關(guān)于R語(yǔ)言運(yùn)算符知識(shí)點(diǎn)講解內(nèi)容,有興趣的朋友們可以參考下。2021-03-03
R語(yǔ)言實(shí)現(xiàn)ggplot重繪天貓雙十一銷售額曲線圖過(guò)程
這篇文章主要為大家介紹了如何使用ggplot繪制天貓雙十一銷售額曲線圖的實(shí)現(xiàn)過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11
Python調(diào)用R語(yǔ)言實(shí)例講解
這篇文章主要介紹了Python調(diào)用R語(yǔ)言實(shí)例講解,文中介紹的非常詳細(xì),有需要的同學(xué)可以研究下2021-03-03

