pypy内存使用量永远增长?

Dav*_*oun 14 python memory memory-leaks pypy

我有一个复杂的python服务器应用程序,它一直在运行.下面是它的一个非常简化的版本.

当我使用python运行以下应用程序时; "python Main.py".它直接使用8mb的ram,并且应该保持在8mb的ram.

当我使用pypy"pypy Main.py"运行它时.它首先使用22mb的ram,随着时间的推移,ram的使用量会增加.30秒后它在50mb,一小时后它在60mb.

如果我将"b.something()"更改为"pass",它就不会像那样吞噬内存.

我在OSX 10.7.4上使用pypy 1.9我可以使用更多ram而不是python的pypy.

有没有办法阻止pypy在很长一段时间内吃掉记忆?

import sys
import time
import traceback

class Box(object):
    def __init__(self):
        self.counter = 0
    def something(self):
        self.counter += 1
        if self.counter > 100:
            self.counter = 0

try:
    print 'starting...'
    boxes = []      
    for i in range(10000):
        boxes.append(Box())
    print 'running!'
    while True:
        for b in boxes:
            b.something()
        time.sleep(0.02)

except KeyboardInterrupt:
    print ''
    print '####################################'
    print 'KeyboardInterrupt Exception'
    sys.exit(1)

except Exception as e:
    print ''
    print '####################################'
    print 'Main Level Exception: %s' % e
    print traceback.format_exc()
    sys.exit(1)
Run Code Online (Sandbox Code Playgroud)

下面是一个时间列表和当时的ram使用情况(我让它在夜间运行).

Wed Sep  5 22:57:54 2012, 22mb ram 
Wed Sep  5 22:57:54 2012, 23mb ram 
Wed Sep  5 22:57:56 2012, 24mb ram 
Wed Sep  5 22:57:56 2012, 25mb ram 
Wed Sep  5 22:57:58 2012, 26mb ram 
Wed Sep  5 22:57:58 2012, 27mb ram 
Wed Sep  5 22:57:59 2012, 29mb ram 
Wed Sep  5 22:57:59 2012, 30mb ram 
Wed Sep  5 22:58:00 2012, 31mb ram 
Wed Sep  5 22:58:02 2012, 32mb ram 
Wed Sep  5 22:58:03 2012, 33mb ram 
Wed Sep  5 22:58:05 2012, 34mb ram 
Wed Sep  5 22:58:08 2012, 35mb ram 
Wed Sep  5 22:58:10 2012, 36mb ram 
Wed Sep  5 22:58:12 2012, 38mb ram 
Wed Sep  5 22:58:13 2012, 39mb ram 
Wed Sep  5 22:58:16 2012, 40mb ram 
Wed Sep  5 22:58:19 2012, 41mb ram 
Wed Sep  5 22:58:21 2012, 42mb ram 
Wed Sep  5 22:58:23 2012, 43mb ram 
Wed Sep  5 22:58:26 2012, 44mb ram 
Wed Sep  5 22:58:28 2012, 45mb ram 
Wed Sep  5 22:58:31 2012, 46mb ram 
Wed Sep  5 22:58:33 2012, 47mb ram 
Wed Sep  5 22:58:35 2012, 49mb ram 
Wed Sep  5 22:58:35 2012, 50mb ram 
Wed Sep  5 22:58:36 2012, 51mb ram 
Wed Sep  5 22:58:36 2012, 52mb ram 
Wed Sep  5 22:58:37 2012, 54mb ram 
Wed Sep  5 22:59:41 2012, 55mb ram 
Wed Sep  5 22:59:45 2012, 56mb ram 
Wed Sep  5 22:59:45 2012, 57mb ram 
Wed Sep  5 23:00:58 2012, 58mb ram 
Wed Sep  5 23:02:20 2012, 59mb ram 
Wed Sep  5 23:02:20 2012, 60mb ram 
Wed Sep  5 23:02:27 2012, 61mb ram 
Thu Sep  6 00:18:00 2012, 62mb ram 
Run Code Online (Sandbox Code Playgroud)

Ron*_*nny 10

http://doc.pypy.org/en/latest/gc_info.html#minimark-environment-variables显示如何调整gc

  • 4个月后,我意识到Ronny与之相关的是更好的解决方案.设置PYPY_GC_MIN = 1GB和PYPY_GC_MAX = 3GB的效果要好得多,保持ram使用率在1到3 GB之间.我发现gc.collect()调用大约需要50ms ...我的应用程序放慢了太多.所以是的,那些环境变量是一个更好的方法.:) (2认同)

Rol*_*ith 5

与cpython相比,pypy使用不同的垃圾收集策略.如果内存的增加是由程序中的某些内容引起的,那么您可以尝试使用模块中的collect函数不时地运行强制垃圾回收gc.在这种情况下,它可能也有助于明确del大型对象,您不再需要这些对象并且不会超出范围.

如果是由于pypy的内部运作,那么提交bug报告可能是值得的,正如Mark Dickinson建议的那样.