美文网首页科研信息学
R的内存控制与管理

R的内存控制与管理

作者: MC学公卫 | 来源:发表于2019-03-04 18:29 被阅读98次
Error in do.ply(i) : 
  task 7 failed - "cannot allocate vector of size 2.5 Gb"

你是否也遇到过这样的报错信息呢?这条报错信息的意思是R不能再获得2.5Gb的运行内存,也就是分配给R的内存不足。R在运行过程中将所有的数据都储存在RAM中,因此在操作大的数据集时会发生这样的报错。

遇到这些情况该如何解决?
本文提供了一些可能有用的方法,供大家参考。


本文概要

+ 如何查看R的内存信息
+ 利用gc()清理R的缓存垃圾
+ linux系统下如何设置分配给R的内存


1. 查看R的内存信息

方法一:

>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%的时候都不需要人工去调用gc()函数,因为R一旦检测到没用的对象就会回收它,除非要人为告诉操作系统要回收内存资源。很多时候要与rm()配合使用,在删除了一些变量后再进行gc()释放内存。

3. ulimit设置内存

注意ulimit是基于bash的命令,需要在linux上操作。而Windows系统通常使用的是memory.limit()命令。ulimit的设置只是暂时的,在重启bash之后会恢复默认设置。可以用ulimit -a来查看所有的内存设置信息。

# 查看默认内存信息
$ ulimit -s 
8192
# 将堆栈内存限制提高到16megs
$ ulimit -s 16384 # enlarge stack limit to 16 megs
# 查看内存信息
$ R --slave -e 'Cstack_info()["size"]' 
    size 
15938355 
# 将CPU运行时间设置为10分钟,4G的虚拟内存
$ ulimit -t 600 -v 4000000

stack memory 即为堆栈内存
什么是堆栈内存?

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

最后转需:

搬运了一个大神写的:关于R的内存管理
http://adv-r.had.co.nz/memory.html#memory
这篇介绍了R的一个向量占有多少内存,不同数据类型的内存占用有何不同,以及如何写代码使得内存得以监控和控制。

如果这些都无法帮助你解决问题,那么你可能需要一台更高级的服务器,或者用R语言以外的其他语言来解决问题。

相关文章

  • R的内存控制与管理

    你是否也遇到过这样的报错信息呢?这条报错信息的意思是R不能再获得2.5Gb的运行内存,也就是分配给R的内存不足。R...

  • iOS 内存管理底层探究

    内存管理方式: MRC:手动管理内存,需要开发人员管理内存,手动调用Release,以控制对象内存的释放。ARC:...

  • ret2_dl_runtime_resolve

    控制传入的index参数(Reloc表项偏移)到可控内存 控制Reloc表项r_info字段,进而控制dynsym...

  • UIViewController

    UIViewController职责视图管理处理与视图相关的通知实现容器视图控制器内存管理生命周期 UIViewC...

  • iOS文档补完计划--UIViewController

    目录 UIViewController职责视图管理处理与视图相关的通知实现容器视图控制器内存管理生命周期 以代码的...

  • 操作系统之内存管理

    内存管理 包括内存管理和虚拟内存管理 内存管理包括内存管理概念、交换与覆盖、连续分配管理方式和非连续分配管理方式(...

  • 内存管理 引用计数 深浅拷贝

    内存管理 引用计数 深浅拷贝常量区:可变和不可变内存管理原则/**1.谁创建。谁释放 alloc r...

  • 访问控制,内存管理

    swift系列课程 访问控制 扩展 将方法赋值给var\let sssimage.png 内存管理

  • 访问控制,内存管理

    右边的会报错,因为Dog的成员和方法是private,左边Dod的成员和方法是fileprivate requir...

  • iOS进阶系列之Objective-C内存管理思考方式

    首先明确一下,Objective-C的内存管理,即引用计数。内存管理方式目前是两种,ARC(Automatic R...

网友评论

    本文标题:R的内存控制与管理

    本文链接:https://www.haomeiwen.com/subject/cabbuqtx.html