13

私は常に常に実行されている複雑な python サーバーアプリを持っています。以下は、それの非常に単純化されたバージョンです。

Pythonを使用して以下のアプリを実行すると; 「python Main.py」。すぐに 8 MB の RAM を使用し、必要に応じて 8 MB の RAM を維持します。

pypy「pypy Main.py」を使用して実行すると。22MB の RAM を使用することから始まり、時間の経過とともに RAM の使用量が増加します。30 秒後には 50 mb、1 時間後には 60 mb になります。

「b.something()」を「pass」に変更すると、そのようにメモリを消費しません。

OSX 10.7.4でpypy 1.9を使用しています。pythonよりも多くのRAMを使用して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)

以下は、その時の時間と 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 
4

2 に答える 2

10

http://doc.pypy.org/en/latest/gc_info.html#minimark-environment-variablesは、gcを微調整する方法を示しています

于 2012-10-01T08:54:55.633 に答える
5

cpython と比較すると、pypy は異なるガベージ コレクション戦略を使用します。メモリの増加がプログラム内の何かによるものである場合は、モジュールのcollect関数を使用して、時々強制ガベージ コレクションを実行することを試みることができます。この場合、もう必要がなく、スコープ外に出ないオブジェクトgcを明示的に大きくすることも役立つ場合があります。del

pypy の内部動作が原因である場合は、Mark Dickinson が提案したように、バグ レポートを提出する価値があるかもしれません。

于 2012-09-15T16:58:44.400 に答える