小编给大家分享一下怎么减少python内存的消耗,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
python打算删除大量涉及像C和c++语言那样的复杂内存管理。当对象离开范围,就会被自动垃圾收集器回收。然而,对于由python开发的大型且长期运行的系统来说,内存管理是不容小觑的事情。
在这篇博客中,我将会分享关于减少python内存消耗的方法和分析导致内存消耗/膨胀根源的问题。这些都是从实际操作中总结的经验,我们正在构建拿督IO的RecoverX分布式备份和恢复平台,这里主要要介绍的是在python(在c++, Java和bash中也有一些类似的组件)中的开发。
<强> python垃圾收集强>
python解释器对正在使用的对象保持计数。当对象不再被引用指向的时候,垃圾收集器可以释放该对象,获取分配的内存。例如,如果你使用常规的python (CPython的,不是JPython)时,python的垃圾收集器将调用免费()/delete ()。
<强>实用工具强>
<强>资源(资源)强>
<代码> 代码>资源模块用来查看项目当前得的固有的)内存消耗(固有内存是项目实际使用的RAM),注意资源库只在linux系统下有效
在祝辞祝辞import 资源 在祝辞祝辞,resource.getrusage .ru_maxrss (resource.RUSAGE_SELF) 443
<>强对象(objgraph) 强>
<代码> objgraph> 代码是一个实用模块,可以展示当前内存中存在的对象
来看看objgraph的简单用法:
import objgraph import 随机 import 检查 class Foo(对象): def 才能__init__(自我): ,,,self.val =,没有 def 才能__str__(自我): ,,,return “foo 作用;val:, {0}“.format (self.val) def f (): 时间=l 才能;[] for 才能小姐:拷贝范围(3): ,,,foo =, Foo () ,,,l.append (foo) return 才能;l def main (): d 才能=,{} l 才能=,f () d才能[& # 39;k # 39;],=, l print 才能“list  l has {0}, objectsoftype Foo ()“.format (len (l))
pythontest1。py
输出:
列表l 10000 objectsoftype Foo ()
引用>
10423
dict Foo 10000——比;Guiltyas带电!
3349
wrapper_descriptor 945元组
函数860
builtin_function_or_method 616
338
weakref 199 method_descriptor
161
getset_descriptor 107 member_descriptor注意,我们在内存中还持有10423个dict # 39;的实例对象。
<强>可视化objgraph依赖项强>
objgraph有个不错的功能,可以显示Foo()对象在内存中存在的因素,即,显示谁持有对它的引用(在这个例子中是列表l <代码> 代码>)。
在RedHat/Centos上,你可以使用sudo yum安装graphviz *安装graphviz
在Ubunbu等系统上使用sudo apt-get安装graphviz *安装graphviz如需查看对象字典<代码> d> 代码,请参考:
objgraph.show_refs (d,文件名=& # 39;sample-graph.png& # 39;)
从内存使用角度来看,我们惊奇地发现,为什么对象没有释放吗?这是因为有人在持有对它的引用。
这个小片段展示了objgraph怎样提供相关信息:
objgraph.show_backrefs (random.choice (objgraph.by_type (& # 39; Foo # 39;)),,文件名=癴oo_refs.png")
在这一案例中,我们查看了Foo类型的随机对象。我们知道该特定对象被保存在内存中,因其引用链接在指定范围内。
有时,以上技巧能帮助我们理解,为什么当我们不再使用某对象时,python垃圾回收器没有将垃圾回收。
难处理的是,有时候我们会发现Foo()占用了很多内存的类。这时我们可以用heapy()来回答以上问题。
<强> heapy 强>
heapy是一个实用的,用于调试内存消耗/泄漏的工具。通常,我将objgraph和heapy搭配使用:用heapy查看分配对象随时间增长的差异,heapy能够显示对象持有的最大内存等;用objgraph找backref链(例如:前4节),尝试获取它们不能被释放的原因。
heapy的典型用法是在不同地方的代码中调用一个函数,试图为内存使用量提供大量收集线索,找到可能会引发的问题:
怎么减少python内存的消耗