我的变量python 共享内存变量有没有释放

苹果/安卓/wp
积分 2568, 距离下一级还需 1032 积分
权限: 自定义头衔, 签名中使用图片, 隐身, 设置帖子权限, 设置回复可见
道具: 彩虹炫, 涂鸦板, 雷达卡, 热点灯, 金钱卡, 显身卡, 匿名卡, 抢沙发, 提升卡, 沉默卡下一级可获得
道具: 千斤顶
购买后可立即获得
权限: 隐身
道具: 金钱卡, 彩虹炫, 雷达卡, 热点灯, 涂鸦板
上火签到天数: 5 天连续签到: 1 天[LV.2]偶尔看看I
本帖最后由 ltx5151 于
14:48 编辑
今天遇到一个朋友问的问题,关于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.
载入中......
热心帮助其他会员
鼓励积极发帖讨论
总评分:&经验 + 140&
学术水平 + 4&
热心指数 + 5&
信用等级 + 4&
本帖被以下文库推荐
& |主题: 245, 订阅: 144
难怪每次清除变量之后,内存还有东西,找到症结所在了
可是为什么设置了上限之后,内存还是不能超过1g呢,奇怪
如果该贴对您有些许帮助,希望你能回复一下或者评一下热心指数!谢谢!
kk22boy 发表于
难怪每次清除变量之后,内存还有东西,找到症结所在了
可是为什么设置了上限之后,内存还是不能超过1g呢, ...这个有可能跟你本机的虚拟内存设置有关。可能我所说的4G也不一定适用于所有电脑。
最好的医生是自己,最好的药物是时间……
good.Thanks
你好,我在做数据模拟的时候也遇到了这个问题,下面是我的程序,当我把变量个数设为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.6,1.6,1..9,-2.2,-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
& & & & & & & && && & }
& && && && &}
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)
本帖最后由 ltx5151 于
23:37 编辑 <font color="#1010080 发表于
你好,我在做数据模拟的时候也遇到了这个问题,下面是我的程序,当我把变量个数设为5000时,程序就会报告: ...你是在循环第一次就出错了?还是在运行了几次之后才出错。如果是第一次出错,可能是单步的内存使用太大了。这种情况下,要么你试图优化计算,要么就只有提高内存使用上限了。
是第一次循环就报错,怎么优化算法呢
<font color="#1010080 发表于
是第一次循环就报错,怎么优化算法呢这个就很难说了。总之在你循环内部优化。你可以具体找一下是哪一个操作内存占用的太多了。比如你每次执行一条命令,然后看每次命令执行后内存的使用情况,就可以找出哪里出了问题。
如果是拟合一个模型,可以尝试有没有更节省内存的方式。比如从少量数据拟合,然后不断根据新数据更新拟合结果。不过这些很可能要自己写了。再比如降低一下参数尝试一下。比如fold=10,可不可以用5替代(没用过LZ的函数,不过看起来相识cross-validaiton吧)。或者有没有其他的package可以支持这样的操作。据我所知,L1 penalty的cox model有好多package可以用,不同的package由于实现方式不同,可能占用内存不同。例如可以尝试用。这个是用Fortran写得,应该效率会更高些。
初级热心勋章
初级热心勋章
初级信用勋章
初级信用勋章
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
如有投资本站或合作意向,请联系(010-);
邮箱:service@pinggu.org
投诉或不良信息处理:(010-)
论坛法律顾问:王进律师13被浏览1,700分享邀请回答182 条评论分享收藏感谢收起4添加评论分享收藏感谢收起我们老师教 OC,今天说内存管理,他把 NSString 的成员变量在 dealloc 里释放了
09:16:19 +08:00 · 4784 次点击
_name 是 Person里NSString的成员变量
然后他 property NSString 传 retain
他是写错了吧?。。。。
47 回复 &| &直到
19:04:04 +08:00
& & 09:25:21 +08:00
国内都教OC了?
& & 09:25:55 +08:00 via iPhone
& & 09:27:29 +08:00 via iPhone
@ 拿虚拟机教……我一直在怀疑这老师的水平……
& & 09:37:43 +08:00
一直用arc 看到release好不习惯。
retain的release没问题啊。
更好的做法是 self.name = nil吧
& & 09:39:41 +08:00
@ 没写错。还在交 MRC 啊。
& & 09:39:41 +08:00
虚拟机。。机智
& & 09:42:18 +08:00
...你到底吐槽嘛?没看懂
& & 09:46:37 +08:00 via iPhone
@ NSString的成员变量也需要释放?不是NSObject对象才需要释放吗?
& & 09:47:12 +08:00
错是没错,不过OC2.0这种写法太啰嗦了。
还有这个年代了应该直接从ARC开始。
& & 09:48:55 +08:00
@ 有retain的就需要release。OC基础教程里有说
& & 09:54:03 +08:00
@ 而且NSString也是NSObject
& & 09:57:58 +08:00 via iPhone
那property nsstring 传copy 还是 retain?
& & 10:01:19 +08:00
看看吧,手寫 release 是正確的。
& & 10:02:07 +08:00
文件一開頭就能看見 NSString 繼承了 NSObject
& & 10:02:49 +08:00
@ 如果我没有理解错你的问题的话,传copy还是retain取决于你声明property的时候是copy还是retain
& & 10:04:53 +08:00 via iPhone
我把Person实例化,然后把实例化对象release,Person里的成员变量不都被release了吗?
& & 10:05:28 +08:00
@ 国内各种培训iOS的,遍地都是
& & 10:14:17 +08:00
@ 你说的逻辑在mrc里面必须显示的在dealloc里面release 成员变量才会出现。
& & 10:22:38 +08:00
@ 从你问的问题来看我感觉你太多基础的东西还不了解,建议你找本书看看,做做练习题,否则知道了这个问题的答案你也未必能理解原因
& & 10:41:45 +08:00
OC 都应该从基础学起,release 和 retain 是最基本的内存管理方法,尽管现在有了ARC ,但是还是要虚心的学习啊,不明白底层的东西,注定走不了多远。
2
NSString 继承自 NSObject 所以NSString 类型的变量还是需要释放的。
3
把Person实例化,这个是在内存中分配一块地址,NSString *string
也会分配一块地址,可以打印下他们的地址出来比较下。你释放的只是person 这个对象的内存地址,这个时候string 是什么情况呢?内存地址也一块被释放了么?可是他们俩是不同的地址啊,这个时候可以在delloc函数 里打印下 string 的retainCount 看下,你要理解 delloc 函数的作用。
4 MRC 的原理只是系统自动在合适的位置加上的 retain 和 release 代码而已。
& & 10:42:16 +08:00
真無語。別上這個課了,去看 CS193P 吧。
& & 10:49:54 +08:00
一切iOS开发不说明版本都是耍流氓.
& & 11:00:50 +08:00 via iPhone
@ 首先感谢您打了这么多字回答我的疑问,我也都看完了,您在第三点最后一段提到的在dealloc打印string的retainCount,我刚刚试了一下,没有在dealloc添加name release,然后直接打印name retainCount ,打印出来的值为-1
& & 11:04:25 +08:00
歪个楼:不要通过 retainCount 做内存判断
& & 11:05:37 +08:00
@ 给您看看代码吧。
main.m:
执行结果:
& & 11:06:12 +08:00
Your tutor is right. There is a best practice in MRC and that is what your tutor shown.
& & 11:13:51 +08:00
我了个大曹
怎么又是人狗。。。
& & 11:18:22 +08:00
@ 0.0教学一般不都是人狗,人学生,云云的。。
& & 14:39:07 +08:00
快 4-5年没见到过这种写法了
& & 14:45:08 +08:00
为什么不是 swift
& & 14:45:59 +08:00
@ 老师太差
& & 14:51:15 +08:00
enable ARC please...
& & 15:25:02 +08:00
@ 你代码中很多写法都过时了,建议看看这个
& & 17:54:26 +08:00
看到 tz 菊花一紧 之前接手一个项目里面的变量都是这么命名的..
& & 18:26:59 +08:00
& & 18:50:49 +08:00 via iPhone
@ 哈哈,命名的时候一下忘记了Weight
& & 19:58:54 +08:00
看到上面还有说直接=nil的,看来MRC懂的人也不多啊,哈哈。
& & 07:28:44 +08:00
看到release下意识看了眼发帖时间,虽然本人也是ARC开始学的
& & 07:57:20 +08:00
虚心点 多学学总是好的... 你觉得他菜,你可以写的比他好鄙视他,前提是你写的比他好。。
@ 人家是用self.name=nil MRC没有问题的
& & 08:28:26 +08:00
@ 没释放就置空貌似有点不妥吧。。。
& & 12:18:27 +08:00
ARC的情况下,编译器会自动帮你在 dealloc 里 release 掉instance variables。。。如果是manual reference counting,既然前面retain过了,析构时必然要release啊
最后,这都什么年代了,还在教早几年前的东西。
& & 12:22:58 +08:00
补充一下,前面有同学说的 retainCount 方法的返回值是不可信的,并不能每次都真实反映对象的引用数。
& & 12:39:20 +08:00
这老师以前是教Java的,而且我们学校我这一届是第一届苹果开发专业的...我估计这老师也是寒假的时候自己学的OC
& & 12:46:30 +08:00
@ 我们老师的教学环境是 OS 10.8.5 X
& & 22:00:33 +08:00
首先如果是MRC的话,retainCount是准确的,在autorelease的情况下才不具备参考,一般是最大无符整数换成有符就是-1了,当然也有随机数的情况版本问题别太纠结。
说明下为什么是-1,主要是因为初始化Person的时候,你传进去的是`@&jack&`,这是什么,就涉及到编译器和内存堆栈的知识,不想长篇大论。明确地说,这其实是个`常量`,编译之后是会直接存储在可执行程序里的,而常量都是由系统来管理其生命周期的(autorelease),因此其retainCount才没有什么参考价值。
不过话又说回来,大部分程序员认为,了解MRC很重要。我不这样认为,我个人决定现在学习确实作用不大,已经到了可以直接ARC的年代,完全没必要为了学习而学习,只要明白其原理即可。
话说当年MRC的时候确实,比现在要多些一倍有余的代码,当然如果觉得多码几行能提高成就感那就另当别论了。
& & 21:18:56 +08:00
MRC年代写一句alloc就接一个release在后面
还是ARC好
& & 19:04:04 +08:00
release没问题,不过都这个时候了应该直接ARC了吧。
你贴的代码,几个文件就有两种代码风格,我也是醉了
retainCount打印的值不准确,你们老师没教你么?
& · & 1942 人在线 & 最高记录 3541 & · &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.0 · 44ms · UTC 14:46 · PVG 22:46 · LAX 06:46 · JFK 09:46? Do have faith in what you're doing.当前位置:
16GB iPhone福音!这个方法一秒释放内存
编辑:Amao
来源:网络
很多人觉得自己不玩游戏不看电影,只是打打电话,买个16G的iPhone就足够了!然而,我们还是太天真了!据说这是16G用户的日常……每天都在清理内存中度过,想要看个电视,还得清理缓存,更不要说下个几集电视《太阳的后裔》缓存好,等着下班路上补剧了。那么16G的我们,到底要怎么拯救我们的内存呢?万万没想到,iPhone其实给我们留下了一个不大不小的彩蛋。不用删除任何数据,就可以增加将近2G的内存!简直是16G用户的福音!亲测有效!下面为您带来详细步骤:第一步:打开设置-通用-存储空间与iCloud用量。可以看到还有586M。第二步:打开设置-iTunes Store与App Store;输入Apple ID密码;返回桌面可以看到iTunes Store!打开这个软件。第三步:随机选一部影片,越大越好,然后点击购买(不用担心,内存空间不足是不会购买成功的)第四步:当跳出这个界面的时候,点击【设置】,你会惊奇的发现!内存空间变大了!释放了将近1G内存!(可以多试几次,释放2G不是梦想)原理非常简单:以为例,这些臃肿的app占用几百兆甚至1-2个g的空间,当你下载1个3.5G的电影时,手机会自动把一些App的临时文件清理掉,如果细心看桌面的App可以看到“正在清理”类似的字样,当然相册里的照片质量也被压缩了。但是这里要提醒大家,如果你平时比较珍惜内存,总是清理缓存文件的话,用此方法释放出的空间不是很大,但也能给你腾出来几百兆的空间!这一招试下来,还删什么App,图片,音乐,一键解决!不要太省心!!赶紧奔走相告吧!如果你有更好玩更给力的苹果玩机教程,欢迎前往25PP论坛【】发帖与更多网友交流。
你可能还对一下内容感兴趣
【上一篇】
【下一篇】
推荐阅读:
看完这篇文章有何感觉?
苹果应用推荐
PP助手准备为您下载应用
未越狱版:鳄鱼小顽皮爱洗澡
如果在10秒后下载任务还没有开始,请下载并安装:
下载步骤如下:什么是内存泄露 内存泄漏的原因是什么【详解】
摘要:内存泄露是什么意思?内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。内存泄漏的原因是什么?【内存泄露】内存泄露是什么意思 内存泄漏的原因是什么
内存泄露是什么意思内存泄漏(
Memory Leak
)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 内存泄漏缺陷具有隐蔽性、积累性的特征,比其他内存非法访问错误更难检测。因为 内存 泄漏的产生原因是内存块未被释放,属于遗漏型缺陷而不是过错型缺陷。此外,内存泄漏通常不会直接产生可观察的错误症状,而是逐渐积累,降低系统整体性能,极端的情况下可能使系统崩溃。随着计算机应用需求的日益增加,应用程序的设计与开发也相应的日趋复杂,开发人员在程序实现的过程中处理的变量也大量增加,如何有效进行内存分配和释放,防止内存泄漏的问题变得越来越突出。例如服务器应用软件,需要长时间的运行,不断的处理由客户端发来的请求,如果没有有效的内存管理,每处理一次请求信息就有一定的内存泄漏。这样不仅影响到服务器的性能,还可能造成整个系统的崩溃。因此,内存管理成为软件设计开发人员在设计中考虑的主要方面。内存泄漏的原因是什么在
语言中,从变量存在的时间生命周期角度上,把变量分为静态存储变量和动态存储变量两类。静态存储变量是指在程序运行期间分配了固定存储空间的变量而动态存储变量是指在程序运行期间根据实际需要进行动态地分配存储空间的变量。在内存中供用户使用的内存空间分为三部分: 程序存储区静态存储区动态存储区程序中所用的数据分别存放在静态存储区和动态存储区中。静态存储区数据在程序的开始就分配好内存区,在整个程序执行过程中它们所占的存储单元是固定的,在程序结束时就释放,因此静态存储区数据一般为全局变量。动态存储区数据则是在程序执行过程中根据需要动态分配和动态释放的存储单元,动态存储区数据有三类函数形参变量、局部变量和函数调用时的现场保护与返回地址。由于动态存储变量可以根据函数调用的需要,动态地分配和释放存储空间,大大提高了内存的使用效率,使得动态存储变量在程序中被广泛使用。开发人员进行程序开发的过程使用动态存储变量时,不可避免地面对内存管理的问题。程序中动态分配的存储空间,在程序执行完毕后需要进行释放。没有释放动态分配的存储空间而造成内存泄漏,是使用动态存储变量的主要问题。一般情况下,开发人员使用系统提供的内存管理基本函数,如
等,完成动态存储变量存储空间的分配和释放。但是,当开发程序中使用动态存储变量较多和频繁使用函数调用时,就会经常发生内存管理错误,例如: 分配一个内存块并使用其中未经初始化的内容;释放一个内存块,但继续引用其中的内容;子函数中分配的内存空间在主函数出现异常中断时、或主函数对子函数返回的信息使用结束时,没有对分配的内存进行释放;程序实现过程中分配的临时内存在程序结束时,没有释放临时内存。内存错误一般是不可再现的,开发人员不易在程序调试和测试阶段发现,即使花费了很多精力和时间,也无法彻底消除。产生方式的分类以产生的方式来分类,内存泄漏可以分为四类:1
常发性内存泄漏发生内存泄漏的代码会被多次执行到,每次被执行时都会导致一块内存泄漏。2
偶发性内存泄漏发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。3
一次性内存泄漏发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块且仅有一块内存发生泄漏。4
隐式内存泄漏程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放 内存 也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到。
最新更新栏目
您可能喜欢
大家都在搜

我要回帖

更多关于 ipython 释放变量内存 的文章

 

随机推荐