一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - R語言 - R語言-解決處理矩陣遇到內存不足的問題

R語言-解決處理矩陣遇到內存不足的問題

2022-01-12 14:41lww1993 R語言

這篇文章主要介紹了R語言-解決處理矩陣遇到內存不足的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

如下:

Error : cannot allocate vector of size X Gb

類似于這種問題的可能處理辦法:

1. 可以用matrix盡量不要用data frame;

2. 可以用integer matrix盡量不要用 double matrix;

3. 對于大量運算后最好加上一個gc(), 強制R語言回收內存;

4. 對于大矩陣而言用bigmemory包,可以將大矩陣放到臨時文件中,不占用內存。

補充:R語言之內存管理

在處理大型數據過程中,R語言的內存管理就顯得十分重要,以下介紹幾種常用的處理方法。

1,設置軟件的內存

?
1
2
3
4
5
6
7
8
9
10
11
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的內存一般不會改變。

2,對象的存儲

R中的對象在內存中存于兩種不同的地方,一種是堆內存(heap),其基本單元是“Vcells”,每個大小為8字節,新來一個對象就會申請一塊空間,把值全部存在這里,和C里面的堆內存很像。第二種是地址對(cons cells),和LISP里的cons cells道理一樣,主要用來存儲地址信息,最小單元一般在32位系統中是28字節、64位系統中是56字節。

?
1
2
3
4
5
ls()           #查看當前對象  
object.size()    查看對象所占內存  
#or  
library(pryr)  
object_size()  #區別于前者,它進行了換算

1) 新建對象分配合適的內存

R會將新的對象存儲在“連續”的內存中,如果沒有這樣的空間就會返回“Cannot allocate vector of size...” 的錯誤,有以下幾種處理方法:

a) 如果有多個矩陣需要存儲,確保優先存儲較大的矩陣,然后依次存儲較小的矩陣.

b) 預先分配合適的內存.

大家都知道R中矩陣的維度并不需要賦一個固定的值(很多語言的數組長度不能為變量),這為寫程序帶來了極大的方便,因此經常在循環中會出現某個矩陣越來越長的情況,實際上,矩陣每增長一次,即使賦給同名的變量,都需要新開辟一塊更大的空間,假設初始矩陣為100K,第二個為101K,一直增到120K,那么,將會分別開辟100K、101K一直到120K的連續堆內存,如果一開始就開一塊120K的,使之從101K逐漸增長到120K,將會大大地節約內存。cbind函數也是這個道理,所以在循環中要注意不要濫用。

c) 換到64位的計算機,這種問題較少出現.

2) 改變當前對象的存儲模式

例如某個矩陣默認就是"double"的,如果這個矩陣的數值都是整數甚至0-1,完全沒必要使用double來占用空間,可以將其改為整數型,可以看到該對象的大小會變為原來的一半。

storage.mode(x) #查看對象的存儲模式 storage.mode(x) <- "integer" #整數型存儲模式

3) 清理中間對象

rm() #刪除變量的引用,經常用它來清理中間對象,其中比較重要的文件可以存在硬盤里,比如csv文件或者RSqlite等

gc() #清理內存空間

4) 清理其他對象

.ls.objects() #查看內存消耗較大的文件,并處理掉其他無關對象.代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.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,修改存儲地址

這部分可參考文獻1。在xp系統上試了一下,得到的存儲地址總是不變,不知道xp系統上有沒有效...

4,選取數據集的子集

這是沒有辦法的辦法,遲早要處理全部的數據,不過可以借此調試代碼或是建模,如在合適的地方清理中間對象

5,寫成腳本文件

Hadley Wickham 建議寫成腳本文件,運行后再清理掉臨時文件

6,使用SOAR包

它可以將特定對象存儲為RData文件并無需加載到內存就能進行分析

?
1
2
3
4
5
6
7
8
9
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,一個有趣的函數

它會告訴你哪一行的代碼消耗了多少時間、內存,釋放多少內存,復制了多少向量.

?
1
2
3
4
5
6
library(devtools)  
devtools::install_github("hadley/lineprof")  
library(lineprof)  
source("D:/test/test.R")  
prof <- lineprof(test("D:/test/testcsv"))  
shine(prof)

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。如有錯誤或未考慮完全的地方,望不吝賜教。

原文鏈接:https://blog.csdn.net/lww1993/article/details/91449923

延伸 · 閱讀

精彩推薦
  • R語言R語言常量知識點總結

    R語言常量知識點總結

    在本篇文章里小編給大家整理了一篇關于R語言常量知識點總結內容,有興趣的朋友們可以學習分享下。...

    R語言教程網12102021-12-29
  • R語言基于R/RStudio中安裝包“無法與服務器建立連接”的解決方案

    基于R/RStudio中安裝包“無法與服務器建立連接”的解決方案

    這篇文章主要介紹了基于R/RStudio中安裝包“無法與服務器建立連接”的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    truffle52815052022-01-05
  • R語言如何用R語言繪制散點圖

    如何用R語言繪制散點圖

    這篇文章主要介紹了如何用R語言繪制散點圖,幫助大家更好的理解和學習使用R語言,感興趣的朋友可以了解下...

    菜鳥教程13002021-12-23
  • R語言R語言gsub替換字符工具的具體使用

    R語言gsub替換字符工具的具體使用

    這篇文章主要介紹了R語言gsub替換字符工具的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    lztttao10372021-12-24
  • R語言R語言中qplot()函數的用法說明

    R語言中qplot()函數的用法說明

    這篇文章主要介紹了R語言中qplot()函數的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    Jack_丁明12752022-01-05
  • R語言R語言中的vector(向量),array(數組)使用總結

    R語言中的vector(向量),array(數組)使用總結

    這篇文章主要介紹了R語言中的vector(向量),array(數組)使用總結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要...

    A葉子葉來5772021-11-14
  • R語言R語言讀取xls與xlsx格式文件過程

    R語言讀取xls與xlsx格式文件過程

    這篇文章主要為大家介紹了使用R語言讀取xls與xlsx格式文件的過程步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪...

    Kanny廣小隸11982022-01-20
  • R語言R語言實現支持向量機SVM應用案例

    R語言實現支持向量機SVM應用案例

    本文主要介紹了R語言實現支持向量機SVM應用案例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    一天_pika5222022-01-18
主站蜘蛛池模板: 欧美交换乱理伦片120秒 | 女子校生下媚药在线观看 | 99热久久这里只精品国产www | 99国产国人青青视频在线观看 | 国产精品免费网站 | b站免费| 精品久久久久亚洲 | haodiaocao几万部精彩视频 | 精品国产一区二区三区久久久蜜臀 | 天天操精品 | 免费人成网址在线观看国内 | 玩高中女同桌肉色短丝袜脚文 | 国产精品欧美亚洲韩国日本 | 亚洲精品私拍国产福利在线 | 91免费播放人人爽人人快乐 | 国产成人精品高清不卡在线 | 四虎永久免费地址ww417 | 玩乳h文奶水和尚 | 精品国产原创在线观看视频 | 午夜爱 | 欧美综合另类 | 免费在线观看a | 日本高清免费不卡在线播放 | 亚洲第6页 | 国产自拍偷拍自拍 | 人人人人人看碰人人免费 | 成年性午夜免费视频网站不卡 | 日韩欧美亚洲每日更新网 | 日韩一区三区 | 99视频精品全部免费观看 | 白丝校花掀起短裙呻吟小说 | 日韩视频一区二区三区 | 欧美精品成人a多人在线观看 | 蜜桃影像传媒破解版 | 嗯啊在线观看免费影院 | 国产在线成人精品 | 网站视频免费 | 91免费视频国产 | 国产免费小视频在线观看 | 超级碰在线视频 | 楚乔传第二部免费观看全集完整版 |