楼主: ltx5151
36967 36

[实际应用] 关于R合理使用内存 [推广有奖]

  • 0关注
  • 26粉丝

VIP

教授

26%

还不是VIP/贵宾

-

威望
1
论坛币
48930 个
通用积分
63.6234
学术水平
100 点
热心指数
143 点
信用等级
68 点
经验
2871 点
帖子
529
精华
0
在线时间
1312 小时
注册时间
2009-5-7
最后登录
2023-10-13

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
今天遇到一个朋友问的问题,关于R处理大数据时out of memory的问题,于是发现原来很多时候大家别没有合理的使用R中最基本的函数。在这里算是提示一下,没有什么高水平的东西,就是值得一些问题。欢迎大家补充和扩展:
该问题是:由于读入的数据较大,无法进行后续操作了。即使用rm()删掉了不相关的东西,依然不起作用。我发现原来问题在于这个同事在rm后没有进行garbage collection。

我们可以通过ls()看work space中有什么变量。
通过object.size()看每个变量占多大内存。
通过memory.size()查看现在的work space的内存使用
通过memory.limit()查看系统规定的内存使用上限。如果你认为现在的内存上限不够用,可以通过memory.limit(newLimit)更改到一个新的上限。 注意,在32位的R中,封顶上限为4G,你无法在一个程序上使用超过4G (数位上限)。这种时候,可以考虑使用64位的版本。

对于一些很大的但无用的中间变量,养成清理的习惯:可以使用rm(object)删除变量,但是记住,rm后记得使用gc()做Garbage collection,否则内存是不会自动释放的,相当于你没做rm.





二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Collection collect Garbage memory object 回收 内存

已有 5 人评分经验 学术水平 热心指数 信用等级 收起 理由
guo.bailing + 100 + 1 + 1 + 1 精彩帖子
李会超 + 40 精彩帖子
410234198 + 1 + 1 + 1 热心帮助其他会员
qoiqpwqr + 1 鼓励积极发帖讨论
kk22boy + 2 + 2 + 2 学习了

总评分: 经验 + 140  学术水平 + 4  热心指数 + 5  信用等级 + 4   查看全部评分

本帖被以下文库推荐

  • · R学习|主题: 262, 订阅: 161
沙发
kk22boy 发表于 2013-3-21 16:25:15 |只看作者 |坛友微信交流群
难怪每次清除变量之后,内存还有东西,找到症结所在了
可是为什么设置了上限之后,内存还是不能超过1g呢,奇怪
如果该贴对您有些许帮助,希望你能回复一下或者评一下热心指数!谢谢!

使用道具

藤椅
ltx5151 发表于 2013-3-21 20:51:01 |只看作者 |坛友微信交流群
kk22boy 发表于 2013-3-21 16:25
难怪每次清除变量之后,内存还有东西,找到症结所在了
可是为什么设置了上限之后,内存还是不能超过1g呢, ...
这个有可能跟你本机的虚拟内存设置有关。可能我所说的4G也不一定适用于所有电脑。

使用道具

板凳
trier2006 发表于 2013-3-22 08:26:11 |只看作者 |坛友微信交流群
谢谢
最好的医生是自己,最好的药物是时间……

使用道具

报纸
godjsy 发表于 2013-3-22 10:20:26 |只看作者 |坛友微信交流群
good.Thanks

使用道具

地板
201010080 发表于 2013-4-29 09:08:20 |只看作者 |坛友微信交流群
你好,我在做数据模拟的时候也遇到了这个问题,下面是我的程序,当我把变量个数设为5000时,程序就会报告:错误,无法分配大小为95.4M的矢量。这是怎么回事,我用了rm(),gc(),还是不管用啊,像这样应该怎么解决呢

rm(list=ls())
library(MASS)
library(stats)
library(utils)
library(graphics)
library(splines)
library(survival)
library(penalized)
library(MASS)
library(SIS)
library(lattice)
library(Matrix)

gendata <- function(n,cor,beta)
  {
        #design matrix
        X=mvrnorm(n,rep(0,p),cor)

        #observed survivial time
        #set.seed(seed+1000)
        logS=log(matrix(runif(n,0,1),n,1)) #log[S(t)]
        T=-logS/(exp(X%*%beta))

      #censored time
        C <- rexp(n, rate =0.1)
       
        #survival time and state
        time <- apply(cbind(C,T),1,min)
        stat <- as.numeric(T<C)

        #combin data
        return(list("X"=X,"surv"=Surv(time,stat),"time"=time,"stat"=stat))
}

n=100  #sample size
sample=2 #simulation times
#beta vector
beta1<-c(1.8762,-2.2746,1.9497,-1.9826,1.956277,-2.2077,1.9929,-2.4966,1.8992,-1.9458)
beta2<-rep(0,4990)
beta<-matrix(c(beta1,beta2))
beta11<-which(beta!=0)
p <- length(beta)
d <- p-length(beta[beta==0])

#generate correlation matrix ,第一种方案,相关系数为零,即个自变量间相互独立
cor=matrix(1,p,p)
for (i in 1:p)
{
        for (j in 1:p)
                {
               if(i!=j)
                 {
                cor[i,j]=0 #correlation matrix
                      }
            }
}

i=1
for (i in 1:sample){
if (i>1 ){rm(simcox,opt1pf,lambda,coxlasso,opt1,fit2,lambda22,fit1,lambda11,pen)
              gc()}#删除上一次循环中的结果,避免影响下一次
###############generate data
simcox <-gendata(n,cor,beta)
attach(simcox)
#Cox: lasso
opt1pf <- profL1(surv, penalized = X, fold = 10, data=simcox)
lambda <- opt1pf$lambda[opt1pf$cvl==max(opt1pf$cvl)]
coxlasso <- penalized(surv, penalized = X, data=simcox, lambda1=lambda)
}

使用道具

7
ltx5151 发表于 2013-4-29 21:05:09 |只看作者 |坛友微信交流群
201010080 发表于 2013-4-29 09:08
你好,我在做数据模拟的时候也遇到了这个问题,下面是我的程序,当我把变量个数设为5000时,程序就会报告: ...
你是在循环第一次就出错了?还是在运行了几次之后才出错。如果是第一次出错,可能是单步的内存使用太大了。这种情况下,要么你试图优化计算,要么就只有提高内存使用上限了。

使用道具

8
水天一色DIY 在职认证  发表于 2013-4-29 22:22:33 |只看作者 |坛友微信交流群
顶一个

使用道具

9
201010080 发表于 2013-5-1 22:12:44 |只看作者 |坛友微信交流群
是第一次循环就报错,怎么优化算法呢

使用道具

10
ltx5151 发表于 2013-5-2 03:57:14 |只看作者 |坛友微信交流群
201010080 发表于 2013-5-1 22:12
是第一次循环就报错,怎么优化算法呢
这个就很难说了。总之在你循环内部优化。你可以具体找一下是哪一个操作内存占用的太多了。比如你每次执行一条命令,然后看每次命令执行后内存的使用情况,就可以找出哪里出了问题。

如果是拟合一个模型,可以尝试有没有更节省内存的方式。比如从少量数据拟合,然后不断根据新数据更新拟合结果。不过这些很可能要自己写了。再比如降低一下参数尝试一下。比如fold=10,可不可以用5替代(没用过LZ的函数,不过看起来相识cross-validaiton吧)。或者有没有其他的package可以支持这样的操作。据我所知,L1 penalty的cox model有好多package可以用,不同的package由于实现方式不同,可能占用内存不同。例如可以尝试用GLMnet。这个是用Fortran写得,应该效率会更高些。

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-20 07:07