Python垃圾收集

utd*_*ant 38 python optimization garbage-collection memory-management

我创建了一些python代码,它在循环中创建一个对象,并在每次迭代中用相同类型的新对象覆盖该对象.这样做了10.000次,Python每秒占用7mb的内存,直到我使用3gb的RAM.有没有人知道从内存中删除对象的方法?

has*_*zmi 27

我认为这是循环引用(虽然这个问题没有明确的问题.)

解决此问题的一种方法是手动调用垃圾回收.手动运行垃圾收集器时,它也会扫描循环引用的对象.

import gc

for i in xrange(10000):
    j = myObj()
    processObj(j)
    #assuming count reference is not zero but still
    #object won't remain usable after the iteration

    if !(i%100):
        gc.collect()
Run Code Online (Sandbox Code Playgroud)

这里不经常运行垃圾收集器,因为它有自己的开销,例如,如果你在每个循环中运行垃圾收集器,解释将变得极其缓慢.


Vin*_*jip 20

您没有提供足够的信息 - 这取决于您正在创建的对象的细节以及您在循环中使用它做的其他事情.如果对象不创建循环引用,则应在下一次迭代时取消分配.例如,代码

for x in range(100000):
  obj = " " * 10000000
Run Code Online (Sandbox Code Playgroud)

不会导致不断增加的内存分配.

  • Python将自动收集带有循环引用的对象*,除非*引用循环中的任何对象都有__del__方法.如果是这种情况,垃圾对象将被移动到gc.garbage列表,您将不得不手动中断参考周期.最好避免同时使用__del__方法和参考周期. (8认同)
  • 避免参考周期的一个解决方案是使用weakref:http://docs.python.org/library/weakref.html (5认同)

Pet*_*son 13

这是在python 2.5中针对某些类型更正的旧错误.发生的事情是python不太擅长收集像空列表/字典/ tupes/floats/int这样的东西.在python 2.5中,这是固定的......主要是.然而浮点数和整数是用于比较的单例,因此一旦其中一个被创建,只要解释器​​存活,它就会保持不变.在处理大量漂浮物时,我被这种最糟糕的事情所困扰,因为它们有一种令人讨厌的独特习惯.这是python 2.4的特点, 并更新了它被折叠成python 2.5

我发现它的最好方法是升级到python 2.5或更新版本以处理列表/字典/元组问题.对于数字,唯一的解决方案是不要让大量的数字进入python.我用自己的包装器来完成c ++对象,但我觉得numpy.array会给出类似的结果.

作为一个帖子脚本我不知道在python 3中发生了什么,但我怀疑数字仍然是单身人士的一部分.所以内存泄漏实际上是该语言的一个特性.


Alg*_*ias 7

如果要创建循环引用,则不会立即释放对象,但必须等待GC循环运行.

您可以使用weakref模块来解决此问题,或者在使用后显式删除对象.