2009-11-19 40 views
18

Tôi đang cố gắng tìm cách giới hạn bộ nhớ có sẵn cho máy ảo Python, vì tùy chọn "-Xmx" trong máy ảo Java không. (Ý tưởng là để có thể chơi với ngoại lệ MemoryError)Giới hạn bộ nhớ VM của Python

Tôi không chắc chắn tùy chọn này tồn tại nhưng có thể có một giải pháp bằng cách sử dụng lệnh của hệ điều hành để "cô lập" một quá trình và bộ nhớ của nó.

Cảm ơn bạn.

Trả lời

11

Trên * nix, bạn có thể phát xung quanh với lệnh ulimit, cụ thể là -m (kích thước bộ nhớ tối đa) và -v (bộ nhớ ảo).

+0

Cảm ơn bạn! Chính xác những gì tôi cần. –

3

Đừng lãng phí thời gian cho việc này.

Thay vào đó, nếu bạn muốn chơi với MemoryError ngoại lệ, hãy tạo một thiết kế tách biệt cấu trúc đối tượng để bạn có thể kiểm tra nó.

Thay vì điều này

for i in range(1000000000000000000000): 
    try: 
     y = AnotherClass() 
    except MemoryError: 
     # the thing we wanted to test 

Xem xét việc này.

for i in range(1000000000000000000000): 
    try: 
     y = makeAnotherClass() 
    except MemoryError: 
     # the thing we wanted to test 

Điều này đòi hỏi một sự bổ sung nhỏ cho thiết kế của bạn.

class AnotherClass(object): 
    def __init__(self, *args, **kw): 
    blah blah blah 

def makeAnotherClass(*args, **kw): 
    return AnotherClass(*args, **kw) 

Hàm bổ sung - về lâu dài - được chứng minh là mẫu thiết kế đẹp. Đó là Nhà máy và bạn thường cần một cái gì đó như thế.

Sau đó, bạn có thể thay thế makeAnotherClass bằng một cái gì đó như thế này.

class Maker(object): 
    def __init__(self, count= 12): 
     self.count= count 
    def __call__(self, *args, **kw): 
     if self.count == 0: 
      raise MemoryError 
     self.count -= 1 
     return AnotherClass(*args, **kw) 
makeAnotherClass= Maker(count=12) 

Phiên bản này sẽ tăng ngoại lệ mà không phải giới hạn bộ nhớ theo bất kỳ cách tối nghĩa, không được hỗ trợ, phức tạp hoặc phép thuật nào.

+0

hum, funny answer :) Chắc chắn phức tạp hơn cái đầu tiên và xâm nhập vào mã của tôi. Oh, và cảm ơn vì đã dạy chúng tôi mẫu thiết kế nhà máy là gì. –

+0

Trong ví dụ trên, bạn có thể muốn sử dụng xrange thay vì phạm vi (giả sử đây không phải là Python 3), nếu không bạn có thể hết bộ nhớ vì lý do sai. –

+1

@tweksteen: nếu bạn nghĩ rằng nó "xâm nhập" thì bạn chưa thực hiện thiết kế thử nghiệm phù hợp. Ngoài ra, nếu bạn không sử dụng các nhà máy, bạn không cho phép mở rộng phân cấp lớp của mình. Bạn nên - nghiêm túc - suy nghĩ lại thiết kế của bạn để bạn sử dụng các nhà máy. –

33

Trên Linux Tôi đang sử dụng mô-đun resource:

import resource 
resource.setrlimit(resource.RLIMIT_AS, (megs * 1048576L, -1L)) 
+0

Công trình này đẹp, cảm ơn bạn. –

Các vấn đề liên quan