2012-09-05 16 views
14

Tôi có một ứng dụng máy chủ python phức tạp, chạy liên tục mọi lúc. Dưới đây là một phiên bản rất đơn giản của nó.Sử dụng bộ nhớ pypy tăng mãi mãi?

Khi tôi chạy ứng dụng bên dưới bằng python; "python Main.py". Nó sử dụng 8mb ram ngay lập tức, và ở lại 8mb ram, như nó phải.

Khi tôi chạy nó bằng pypy "pypy Main.py". Nó bắt đầu bằng cách sử dụng 22mb ram và theo thời gian sử dụng ram phát triển. Sau 30 giây ở tốc độ 50mb, sau một giờ với tốc độ 60mb.

Nếu tôi thay đổi "b.something()" thành "pass", nó sẽ không chiếm dụng bộ nhớ như thế.

Tôi đang sử dụng pypy 1.9 trên OSX 10.7.4 Tôi ổn với pypy sử dụng nhiều ram hơn python.

Có cách nào để ngăn chặn pypy ăn bộ nhớ trong một thời gian dài không?

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) 

Dưới đây là danh sách thời gian và thời gian sử dụng ram tại thời điểm đó (tôi để nó chạy qua đêm).

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. Tôi không thể tái tạo điều này. Với pypy 1.9 (từ Macports) và OS X 10.6.8, tôi thấy việc sử dụng bộ nhớ (như được báo cáo bởi 'top', từ cột RSIZE) ở khoảng 46M. Nó có thể đáng giá một báo cáo lỗi. –

+0

Tôi vẫn có quá trình đó đang chạy, điểm dữ liệu mới cho nó: Thu Sep 6 09:02:26 2012, 63mb ram – DavidColquhoun

+2

Tôi có thể tạo lại điều này bằng pypy 1.8, nhưng 1.9 dường như đã sửa lỗi này – goncalopp

Trả lời

10
+0

Rất tiếc, đã nhận xét về câu trả lời sai, đã chuyển nhận xét của tôi đến câu trả lời ở trên. – DavidColquhoun

+2

4 tháng sau và tôi đã nhận ra rằng những gì Ronny liên kết đến là một giải pháp tốt hơn. Đặt PYPY_GC_MIN = 1GB và PYPY_GC_MAX = 3GB hoạt động tốt hơn nhiều, giữ mức sử dụng ram giữa 1 và 3 gb. Và tôi thấy rằng các cuộc gọi gc.collect() mất khoảng 50ms ... làm chậm ứng dụng của tôi xuống quá nhiều. Vì vậy, yeah, những biến môi trường là một cách tốt hơn để đi. :) – DavidColquhoun

+0

@DavidColquhoun là 'PYPY_GC_MIN = 1GB' và' PYPY_GC_MAX = 3GB', không phải 'PYPY_GC_MIN =" 1GB "' và 'PYPY_GC_MAX =" 3GB "', đúng không? –

5

So với cpython, pypy use different garbage collection strategies. Nếu sự gia tăng bộ nhớ là do một cái gì đó trong chương trình của bạn, bạn có thể cố gắng chạy một bộ sưu tập rác cưỡng bức mọi lúc và sau đó, bằng cách sử dụng chức năng collect từ mô-đun gc. Trong trường hợp này, nó cũng có thể giúp rõ ràng del các đối tượng lớn mà bạn không cần nữa và không vượt quá phạm vi.

Nếu đó là do hoạt động bên trong của pypy, nó có thể là giá trị nó gửi một báo cáo lỗi, như Mark Dickinson đề nghị.

+0

Thankyou! gc.collect() là những gì tôi cần. Tôi chạy mà mỗi vài giây và nó giữ cho việc sử dụng bộ nhớ phẳng ... kiểm tra các đồ thị ở đây để xem sự khác biệt mà một trong những lệnh thực hiện: http://datasmugglers.com/2012/10/06/server-ram-usage/ – DavidColquhoun