2012-09-05 21 views
14

私は、常時稼働している複雑なPythonサーバーアプリケーションを持っています。以下は非常に単純化されたバージョンです。pypyのメモリ使用量は永遠に増えますか?

私は以下のアプリをpythonで実行します。 "python Main.py"それは直ちに8MBのRAMを使い、8MBのRAMにとどまる。

私はpypy "pypy Main.py"を使って実行します。それは22MBのRAMを使用することから始まり、時間の経過とともにRAMの使用量が増えます。 30秒後に50MBで、1時間後に60MBで。

"b.something()"を "pass"に変更すると、そのようなメモリが邪魔になることはありません。

私はOSX 10.7.4でpypy 1.9を使用しています。 私はpythonよりも多くのRAMを使用しても大丈夫です。

パイピーが長時間メモリを使い果たしてしまうのを防ぐ方法はありますか?以下は

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 
+1

Hmm。私はこれを再現することはできません。 pypy 1.9(Macports製)とOS X 10.6.8では、メモリ使用量(RSIZEカラムの 'top'によって報告されている)が約46Mに留まることがわかりました。バグ報告の価値があるかもしれません。 –

+0

私はまだこのプロセスを実行しています。新しいデータポイント: Thu Sep 6 09:02:26 2012、63MB RAM – DavidColquhoun

+2

pypy 1.8を使用してこれを再現できますが、1.9はこの問題を修正したようです。 – goncalopp

答えて

10

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

+0

間違った返信にコメントして、上記の回答に私のコメントを移動しました。 – DavidColquhoun

+2

4ヶ月後、私はRonnyがリンクしているものがより良い解決策であることに気付きました。 PYPY_GC_MIN = 1GBとPYPY_GC_MAX = 3GBを設定すると、RAMの使用量を1〜3GBの範囲で保つことができます。そして、gc.collect()呼び出しが約50msかかるとわかりました。アプリケーションの実行速度が遅くなりすぎました。だからええ、環境変数はもっと良い方法です。 :) – DavidColquhoun

+0

@DavidColquhounは、 'PYPY_GC_MIN = 1GB'と' PYPY_GC_MAX = 3GB'で、 'PYPY_GC_MIN =" 1GB "と' PYPY_GC_MAX = "3GB"ではなく、正しいですか? –

5

ppyyは、cpythonと比較してdifferent garbage collection strategiesを使用します。 メモリの増加がプログラム内の何らかの要因によるものである場合、gcモジュールのcollect関数を使用して、毎回強制ガベージコレクションを実行しようとする可能性があります。この場合、あなたがもはや必要とせず、範囲外にならない大きなオブジェクトを明示的にdelするのに役立つかもしれません。

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

+0

ありがとうございます! gc.collect()は私が必要としていたものでした。私は数秒おきにそれを実行し、メモリ使用量を平らに保ちます。ここでグラフをチェックして、1つのコマンドが作成した違いを確認してください:http://datasmugglers.com/2012/10/06/server-ram-usage/ – DavidColquhoun

関連する問題