python传值传引用 内存引用

Python中使用MELIAE分析程序内存占用实例
&更新时间:日 15:51:25 & 投稿:junjie
这篇文章主要介绍了Python中使用MELIAE分析程序内存占用实例,本文直接给出使用代码示例,需要的朋友可以参考下
写的dht协议搜索的程序,这几天优化了一下发现速度确实快了好多。但是出现了一个新的问题,内存直接飙升,我开了十个爬虫占用内存800m。开始我以为是节点太多了,找了几个小问题修改一下,发现没用。后来就到网上查找python内存分析的工具,查了一点资料发现python有个meliae库操作非常方便,就使用分析了一下,发现不是节点太多的原因0 0,是保存发送的t_id,用来标示返回的消息是那个发出的一个字典过大了。
从分析的结果非常容易的定位了某个对象的数量和大小,非常容易分析。我开始以为是因为好多发送查询信息以后,对面没返回造成这个字典里的元素没有释放造成的,我就用过期时间判断了一下,进行过期删除。发现是小了,但是不是非常显著,好像少了几十不到100M。后来又减少了查找一个随机hash的时间,以前是1分钟查一次,我改成了就第一次查!,发现没减少0 0.不知道是啥的原因。应该就是查找hash,询问节点,然后返回然后询问里边的节点,最后数量越来越多,但是我不明白的是,怎么会这么多运行一分钟就有60万条。也就是说当时内存没释放的对象就有这么多。达到这个内存占用后,基本就不再变化,有很小很慢的提升,因为还开的其他程序,不确定是不是这些程序其他对象的增加造成的。等分阶段dump测试一下。
安装直接pip install meliae 就ok了,我看好久没更新的项目了,不知道还有没有好的替代品不过用着还不错。
将内存dump到文件
&from meliae import scanner
&scanner.dump_all_objects('/tmp/dump%s.txt' % time.time())
分析文件:
&from meliae import loader
&#加载dump文件
&om = loader.load('/opt/log/dump.txt')
&#计算各Objects的引用关系
&om.compute_parents()
&#去掉各对象Instance的_dict_属性
&om.collapse_instance_dicts()
&#分析内存占用情况
&om.summarize()
字段意义如下:
Index : 行索引号
Count : 该类型的对象总数
%(Count) : 该类型的对象总数 占 所有类型的对象总数 的百分比
Size : 该类型的对象总字节数
%(Size) : 该类型的对象总字节数 占 所有类型的对象总字节数 的百分比
Cum : 累积行索引后的%(Size)
Max : 该类型的对象中,最大者的字节数
Kind : 类型
分析某个对象,找出它的引用关系
&#得到所有的POP3ClientProtocol对象
&p = om.get_all('POP3ClientProtocol')
&#查看第一个对象
&#可以查看该对象的所有引用
&#查看谁引用了这个对象
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具python 内存引用_百度知道
python 内存引用
python内存引用比如a='tom'b='tom',那么这两个tom实际上是一个没错地址,这很奇怪啊,假如是两个重名的人,其中一个要改名字,那岂不是两个人都要改了?python这么设计的原因是什么?...
python 内存引用比如a='tom'b='tom',那么这两个tom实际上是一个没错地址,这很奇怪啊,假如是两个重名的人,其中一个要改名字,那岂不是两个人都要改了?python这么设计的原因是什么?
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
擅长:暂未定制
python的一切变量都是对象,变量的存储,采用了地址引用的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只本身。而在复杂数据结构中,更改数据结构中的元素(基本数据类型),仅仅是改变了这个元素的地址,而不会影响复杂数据结构本身的地址。如果需要开辟新的内存,使用深拷贝。这么设计的主要原因是节省内存,面向对象的程序语言大都这么设计。
两个人重名了别的属性不重名啊。。。既然要描述一个人为什么不是封装后描述呢。。。
为你推荐:
其他类似问题
您可能关注的内容
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。Python基础:Python是如何进行内存管理的_常见问题_辽宁优就业
IT培训学院
400-650-7353
> Python基础:Python是如何进行内存管理的
Python基础:Python是如何进行内存管理的
11:39:21 来源:互联网
python内存管理机制 ( Pymalloc ) 包括三个方面:一垃圾回收机制,二对象的引用计数机制,三内存池机制
一、垃圾回收
1,在语言内部,当一个对象的引用计数为0时,它将被垃圾收集机制处理掉;
2,当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致内存泄露)。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。
二、对象的引用计数机制
内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。
引用计数增加的情况:
1,一个对象分配一个新名称
2,将其放入一个容器中(如列表、元组或字典)
引用计数减少的情况:
1,使用del语句对对象别名显示的销毁
2,引用超出作用域或被重新赋值
sys.getrefcount( )函数可以获得对象的当前引用计数
多数情况下,引用计数比你猜测得要大得多。对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。
三、内存池机制
Python语言虽然提供了对内存的垃圾收集机制,但实际上它将不用的内存放到内存池而不是返回给操作系统,所以就有了以下:
1,Pymalloc机制:这个主要是为了加速Python的执行效率,Python引入了一个内存池机制,用于管理,为了对小块内存的申请和释放。
2,Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。
3,对于Python对象,比如整数、浮点数和List这些,都有自己独立的内存池,对象间并不共享他们的内存池。换句话说就是,假设你分配并且释放了大量的整数,那么用于缓存这些整数的内存就不能再分配给浮点数。
Python应用领域越来越广,企业需求也越来越多,薪资也在逐步上涨,如果有同学想从事还是不错的选择。Python学习相对简单,但是还是建议同学们在老师的带领下,有专业的实训项目促进学习,学习效果才能更好,之后在Python行业中才能更稳步前行。
更多分享交流,礼品领取,海量干货,请扫描下方内部资料领取二维码,一不小心就爱上IT,成为了大佬!
微信二维码
内部资料领取
微博二维码
免责声明:本文来源于网络,由网友提供或网络搜集,仅供个人交流学习参考使用,不涉及商业盈利目的。如有版权问题,请联系本站管理员予以更改或删除。谢谢合作!
热门标签:
在线学习 ● APP下载
微信扫一扫
400-650-7353python调用C++,内存如何释放,清大神帮忙看看
[问题点数:100分]
本版专家分:0
结帖率 99.16%
CSDN今日推荐
本版专家分:3413
2016年10月 其他开发语言大版内专家分月排行榜第一
本版专家分:0
本版专家分:3413
2016年10月 其他开发语言大版内专家分月排行榜第一
本版专家分:0
匿名用户不能发表回复!
其他相关推荐
我们在使用tensorflow+pycharm 写程序的时候, 有时候会在控制台终止掉正在运行的程序,但是有时候程序已经结束了,nvidia-smi也看到没有程序了,但是GPU的内存并没有释放,那么怎么解决该问题呢?
首先执行下面的命令
sudo fuser -v /dev/nvidia* #查找占用GPU资源的PID
因为我们只有一块显卡,所以显示如下图所示: 可以看到我们的nvidia0上还有一
在日常使用中,如果本本运行时间长变得很慢,我们通常绿色系统收藏都是直接重启系统那就可以恢复速度,系统吧告诉你通过重启会恢复速度是因为内存缓存被清空了,其实借助系统自带清空内存命令,无需重启即可一键释放内存资源。
方法是登录Win7系统后,右键单击桌面空白处,然后在“新建”菜单选择“快捷方式” (如图1),弹出一个窗口后,在对象位置下输入“%windir%/system32/rundl
ubuntu的图形界面用的是gnome,我发现ubunut用gnome老是死,如果工作八个小时,要死二,三次搞得我很郁闷。家里的centos用的也是gnome,就不会死,并且家里电脑内存还小。
root@ubuntu:/home/zhangying# free -m
我们一般常说的内存泄漏是指堆内存的泄漏。程序从堆中分配的内存使用完毕后必须显式释放,否则这块内存就不能被再次使用,即这块内存泄漏了。内存泄漏导致软件在运行过程中占用越来越多的内存,程序的效率会越来越低,从而影响用户的体验,失去市场竞争力。
 为了预防内存泄漏我们要求程序使用malloc、new等函数从堆中分配的内存必须在使用完后调用free、delete函数释放该内存。但是如果指向该内存指
清理备用内存的软件,感觉很不错,希望对大家有帮助
int* fa();
void main()
int *p=fa();
printf(&%d\n&,*p);
return &i;
我记得书上说过当函数调用结束后,函数中所定义的局部变量会全部被释放,也就是函数fa()中的变量i在调用结束后会被释放,为什么这里还能引用输出函数f
| 论坛注册| 加入收藏 | 设为首页| RSS
首页Linux频道软件下载开发语言嵌入式频道开源论坛
| php | JSP | ASP | asp.net | JAVA | c/c++/c# | perl | JavaScript | Ba
我们知道free(p)是释放掉p所指向的内存,那么是释放了多长的一段内存呢?我们的系统是如何知道要释放多少内存的呢?下面我来讲讲这个问题。
请看下面一段代码
哪个大神帮忙看看,谢谢啦
C语言有两种内存申请方式:
1、静态申请:当你声明全局或静态变量的时候,会用到静态申请内存。静态申请的内存有固定的空间大小。空间只在程序开始的时候申请一次,并且不再释放(除非程序结束)。
2、自动申请:当你声明自动变量的时候会使用自动申请。函数参数、局部变量都属于自动变量。这些变量空间在程序执行致相关语句块申请,离开语句块时释放。
  还有一种内存申请方式:动态内存申请。C语言变}

我要回帖

更多关于 python引用传递 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信