R的內(nèi)存控制與管理

Error in do.ply(i) : 
  task 7 failed - "cannot allocate vector of size 2.5 Gb"

你是否也遇到過這樣的報錯信息呢?這條報錯信息的意思是R不能再獲得2.5Gb的運行內(nèi)存,也就是分配給R的內(nèi)存不足。R在運行過程中將所有的數(shù)據(jù)都儲存在RAM中,因此在操作大的數(shù)據(jù)集時會發(fā)生這樣的報錯。

遇到這些情況該如何解決?
本文提供了一些可能有用的方法,供大家參考。


本文概要

+ 如何查看R的內(nèi)存信息
+ 利用gc()清理R的緩存垃圾
+ linux系統(tǒng)下如何設(shè)置分配給R的內(nèi)存


1. 查看R的內(nèi)存信息

方法一:

>system('grep MemTotal /proc/meminfo')
MemTotal:       65699540 kB

方法二:

> system('free -m')
              total        used        free      shared  buff/cache   available
Mem:          64159       16630       42839          26        4690       46905
Swap:         10191        9093        1098

2. gc()清理垃圾

gc()是R的清理緩存垃圾的命令,garbage collection,但是Stack Overflow上有些人說這個命令的用處不大,因為R在大部分時候會自動運行這個命令。在99%的時候都不需要人工去調(diào)用gc()函數(shù),因為R一旦檢測到?jīng)]用的對象就會回收它,除非要人為告訴操作系統(tǒng)要回收內(nèi)存資源。很多時候要與rm()配合使用,在刪除了一些變量后再進行g(shù)c()釋放內(nèi)存。

3. ulimit設(shè)置內(nèi)存

注意ulimit是基于bash的命令,需要在linux上操作。而Windows系統(tǒng)通常使用的是memory.limit()命令。ulimit的設(shè)置只是暫時的,在重啟bash之后會恢復(fù)默認設(shè)置??梢杂胾limit -a來查看所有的內(nèi)存設(shè)置信息。

# 查看默認內(nèi)存信息
$ ulimit -s 
8192
# 將堆棧內(nèi)存限制提高到16megs
$ ulimit -s 16384 # enlarge stack limit to 16 megs
# 查看內(nèi)存信息
$ R --slave -e 'Cstack_info()["size"]' 
    size 
15938355 
# 將CPU運行時間設(shè)置為10分鐘,4G的虛擬內(nèi)存
$ ulimit -t 600 -v 4000000

stack memory 即為堆棧內(nèi)存
什么是堆棧內(nèi)存?

ulimit其他的options:

-a     All current limits are reported
-c     The maximum size of core files created
-d     The maximum size of a process's data segment
-e     The maximum scheduling priority ("nice")
-f     The  maximum  size  of files written by the shell and its
       children
-i     The maximum number of pending signals
-l     The maximum size that may be locked into memory
-m     The maximum resident set size (has no effect on Linux)
-n     The maximum number of open file descriptors (most systems
       do not allow this value to be set)
-p     The pipe size in 512-byte blocks (this may not be set)
-q     The maximum number of bytes in POSIX message queues
-r     The maximum real-time scheduling priority
-s     The maximum stack size
-t     The maximum amount of cpu time in seconds
-u     The  maximum  number  of  processes available to a single
       user
-v     The maximum amount of virtual  memory  available  to  the
       shell

有用的命令:

  • object.size() 查看對象的占用大小
object.size(mat)
3821700056 bytes
# 364.4M

最后轉(zhuǎn)需:

搬運了一個大神寫的:關(guān)于R的內(nèi)存管理
http://adv-r.had.co.nz/memory.html#memory
這篇介紹了R的一個向量占有多少內(nèi)存,不同數(shù)據(jù)類型的內(nèi)存占用有何不同,以及如何寫代碼使得內(nèi)存得以監(jiān)控和控制。

如果這些都無法幫助你解決問題,那么你可能需要一臺更高級的服務(wù)器,或者用R語言以外的其他語言來解決問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容