怎么减少python内存的消耗

  介绍

小编给大家分享一下怎么减少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;)

怎么减少python内存的消耗

从内存使用角度来看,我们惊奇地发现,为什么对象没有释放吗?这是因为有人在持有对它的引用。

这个小片段展示了objgraph怎样提供相关信息:

objgraph.show_backrefs (random.choice (objgraph.by_type (& # 39; Foo # 39;)),,文件名=癴oo_refs.png")

怎么减少python内存的消耗

在这一案例中,我们查看了Foo类型的随机对象。我们知道该特定对象被保存在内存中,因其引用链接在指定范围内。

有时,以上技巧能帮助我们理解,为什么当我们不再使用某对象时,python垃圾回收器没有将垃圾回收。

难处理的是,有时候我们会发现Foo()占用了很多内存的类。这时我们可以用heapy()来回答以上问题。

<强> heapy

heapy是一个实用的,用于调试内存消耗/泄漏的工具。通常,我将objgraph和heapy搭配使用:用heapy查看分配对象随时间增长的差异,heapy能够显示对象持有的最大内存等;用objgraph找backref链(例如:前4节),尝试获取它们不能被释放的原因。

heapy的典型用法是在不同地方的代码中调用一个函数,试图为内存使用量提供大量收集线索,找到可能会引发的问题:

怎么减少python内存的消耗