2010-04-20 60 views
8

Tôi đang làm việc để giải quyết rò rỉ bộ nhớ trong ứng dụng Python của mình. Đây là điều - nó thực sự chỉ xuất hiện trên Windows Server 2008 (không phải R2) nhưng không có phiên bản trước của Windows, và nó cũng không giống như nó đang xảy ra trên Linux (mặc dù tôi chưa thực hiện gần như nhiều thử nghiệm trên Linux).Python - Rò rỉ bộ nhớ

Để khắc phục điều đó, tôi thiết lập gỡ lỗi trên các bộ thu rác:

gc.set_debug(gc.DEBUG_UNCOLLECTABLE | gc.DEBUG_INSTANCES | gc.DEBUG_OBJECTS) 

Sau đó, định kỳ, tôi đăng nhập các nội dung của gc.garbage.

Thing là, gc.garbage luôn trống, nhưng mức sử dụng bộ nhớ của tôi tăng lên và tăng lên.

Rất khó hiểu.

+9

Dave, rõ ràng vấn đề của bạn có thể được khắc phục bằng cách xóa dòng 123 .... và thêm i = 1 vào dòng 27 ... –

+0

nghiêm túc, tôi nghĩ sẽ giúp bạn chúng tôi cần một số mã. –

+1

Bán trùng lặp (hoặc có thể là một chủ đề thú vị để đọc cho bạn): http://stackoverflow.com/questions/1435415/python-memory-leaks/1435426#1435426 (nếu điều này không thành công, hãy quay trở lại với các chi tiết) – ChristopheD

Trả lời

2

Tốt hơn bao giờ hết. Giải quyết điều này khá nhanh chóng nhưng quên đăng câu trả lời. Cuối cùng, chúng tôi đã trích xuất mã Twisted và sử dụng CherryPy.Đó là cách nhẹ hơn, dễ sử dụng hơn, và nó không còn xuất hiện để xảy ra. Có khả năng đó là lỗi của chúng tôi rằng nó đã xảy ra và KHÔNG của Twisted, nhưng mã rất xấu, chúng tôi chỉ quyết định viết lại nó sẽ là dễ nhất.

+0

đây không phải là một câu trả lời –

26

Nếu không bao giờ có bất kỳ rác nào trong gc.garbage, thì tôi không chắc bạn đang cố gắng làm gì bằng cách bật gỡ lỗi GC. Chắc chắn, nó sẽ cho bạn biết đối tượng nào được xem xét để dọn dẹp, nhưng điều đó không đặc biệt thú vị nếu bạn không có tham chiếu vòng tròn nào không thể dọn dẹp được.

Nếu chương trình bạn đang sử dụng ngày càng nhiều bộ nhớ hơn theo hệ điều hành, nói chung có thể có bốn trường hợp khác nhau lúc chơi:

  1. ứng dụng của bạn được lưu trữ ngày càng nhiều thứ, giữ tham chiếu đến từng người để họ không được thu thập.
  2. Ứng dụng của bạn đang tạo ra tham chiếu vòng tròn giữa các đối tượng mà không thể được làm sạch bởi module gc (thường là bởi vì một trong số họ có một phương pháp __del__.)
  3. ứng dụng của bạn được giải phóng (và tái sử dụng) bộ nhớ, nhưng hệ điều hành không muốn bộ nhớ được sử dụng lại, do đó, nó tiếp tục phân bổ các khối bộ nhớ mới.
  4. Rò rỉ là rò rỉ bộ nhớ thực nhưng trong mô-đun mở rộng C/C++ mà mã của bạn đang sử dụng.

Từ mô tả của bạn có vẻ như đó không phải là # 1 (vì nó sẽ hoạt động giống nhau trên bất kỳ HĐH nào) và dường như không phải # 2 (vì không có gì trong gc.garbage.) Xem xét # 3, Windows (nói chung) có một bộ cấp phát bộ nhớ nổi tiếng là xấu với phân bổ phân tán, nhưng Python làm việc xung quanh điều này với lối vào obmalloc của nó cho malloc(). Nó vẫn có thể là một vấn đề cụ thể trong thư viện hệ thống Windows Server 2008 mà làm cho nó trông giống như ứng dụng của bạn đang sử dụng ngày càng nhiều bộ nhớ. Hoặc nó có thể là một trường hợp của # 4, một mô-đun mở rộng C/C++, hoặc một DLL được sử dụng bởi Python hoặc một mô-đun mở rộng, với một rò rỉ bộ nhớ.

3

Nói chung, thủ phạm đầu tiên cho rò rỉ bộ nhớ trong python là tìm thấy trong các tiện ích mở rộng C.
Bạn có sử dụng bất kỳ thiết bị nào trong số đó không?

Hơn nữa, bạn nói vấn đề chỉ xảy ra vào năm 2008; Sau đó tôi sẽ kiểm tra các phần mở rộng cho bất kỳ sự không tương thích nào, bởi vì với Vista và 2008 đã có khá nhiều thay đổi nhỏ gây ra các vấn đề trên trường đó.
Như và thay thế, hãy thử thực thi ứng dụng của bạn trong chế độ tương thích Windows, chọn Windows XP - điều này có thể giúp giải quyết vấn đề, đặc biệt nếu nó liên quan đến những thay đổi về bảo mật.