Hướng dẫn python garbage collection memory leak - Rò rỉ bộ nhớ thu gom rác python

Tôi có một kịch bản dài, nếu để chạy đủ lâu, sẽ tiêu thụ tất cả bộ nhớ trên hệ thống của tôi.

Không đi sâu vào chi tiết về kịch bản, tôi có hai câu hỏi:

  1. Có bất kỳ "thực tiễn tốt nhất" nào để làm theo, điều này sẽ giúp ngăn ngừa rò rỉ xảy ra?
  2. Có những kỹ thuật nào để gỡ lỗi rò rỉ bộ nhớ trong Python?

Đã hỏi ngày 16 tháng 9 năm 2009 lúc 20:56Sep 16, 2009 at 20:56

Hướng dẫn python garbage collection memory leak - Rò rỉ bộ nhớ thu gom rác python

FragsworthfragsworthFragsworth

32.3K26 Huy hiệu vàng82 Huy hiệu bạc97 Huy hiệu đồng26 gold badges82 silver badges97 bronze badges

4

Tôi đã thử ra hầu hết các tùy chọn được đề cập trước đây nhưng thấy gói nhỏ và trực quan này là tốt nhất: pympler

Nó khá thẳng về phía trước để theo dõi các đối tượng không được thu thập rác, hãy kiểm tra ví dụ nhỏ này:

Cài đặt gói qua pip install pympler

from pympler.tracker import SummaryTracker
tracker = SummaryTracker()

# ... some code you want to investigate ...

tracker.print_diff()

Đầu ra cho bạn thấy tất cả các đối tượng đã được thêm vào, cộng với bộ nhớ mà chúng đã tiêu thụ.

Đầu ra mẫu:

                                 types |   # objects |   total size
====================================== | =========== | ============
                                  list |        1095 |    160.78 KB
                                   str |        1093 |     66.33 KB
                                   int |         120 |      2.81 KB
                                  dict |           3 |       840 B
      frame (codename: create_summary) |           1 |       560 B
          frame (codename: print_diff) |           1 |       480 B

Gói này cung cấp một số tính năng khác. Kiểm tra tài liệu của Pympler, đặc biệt là phần xác định rò rỉ bộ nhớ.

Đã trả lời ngày 28 tháng 4 năm 2015 lúc 15:27Apr 28, 2015 at 15:27

Hướng dẫn python garbage collection memory leak - Rò rỉ bộ nhớ thu gom rác python

2

Hãy để tôi giới thiệu công cụ mem_top mà tôi đã tạo

Nó đã giúp tôi giải quyết một vấn đề tương tự

Nó chỉ ngay lập tức hiển thị các nghi phạm hàng đầu về rò rỉ bộ nhớ trong chương trình Python

Đã trả lời ngày 27 tháng 5 năm 2014 lúc 7:32May 27, 2014 at 7:32

5

Mô-đun Tracemalloc được tích hợp như một mô-đun tích hợp bắt đầu từ Python 3.4, và xuất hiện, nó cũng có sẵn cho các phiên bản Python trước đây như một thư viện của bên thứ ba (mặc dù chưa được thử nghiệm).

Mô -đun này có thể xuất các tệp và dòng chính xác phân bổ bộ nhớ nhiều nhất. IMHO, thông tin này có giá trị hơn so với số lượng các trường hợp được phân bổ cho mỗi loại (cuối cùng là rất nhiều bộ dữ liệu 99% thời gian, đó là một manh mối, nhưng hầu như không giúp ích gì trong hầu hết các trường hợp).

Tôi khuyên bạn nên sử dụng tracemalloc kết hợp với pyrasite. 9 lần trên 10, chạy 10 đoạn trích hàng đầu trong vỏ Pyrasite sẽ cung cấp cho bạn đủ thông tin và gợi ý để khắc phục rò rỉ trong vòng 10 phút. Tuy nhiên, nếu bạn vẫn không thể tìm thấy nguyên nhân rò rỉ, Pyrasite-Shell kết hợp với các công cụ khác được đề cập trong chủ đề này có thể sẽ cung cấp cho bạn thêm một số gợi ý nữa. Bạn cũng nên xem xét tất cả các trình trợ giúp bổ sung được cung cấp bởi Pyrasite (chẳng hạn như trình xem bộ nhớ).

Đã trả lời ngày 16 tháng 8 năm 2017 lúc 19:28Aug 16, 2017 at 19:28

user1527491user1527491user1527491

8559 Huy hiệu bạc20 Huy hiệu Đồng9 silver badges20 bronze badges

1

Bạn nên đặc biệt xem xét dữ liệu toàn cầu hoặc tĩnh của bạn (dữ liệu sống dài).

Khi dữ liệu này phát triển mà không bị hạn chế, bạn cũng có thể gặp rắc rối trong Python.

Người thu gom rác chỉ có thể thu thập dữ liệu, không được tham chiếu nữa. Nhưng dữ liệu tĩnh của bạn có thể kết nối các yếu tố dữ liệu cần được giải phóng.

Một vấn đề khác có thể là các chu kỳ bộ nhớ, nhưng ít nhất là theo lý thuyết, người thu gom rác nên tìm và loại bỏ các chu kỳ - ít nhất là miễn là chúng không được nối trên một số dữ liệu sống dài.

Những loại dữ liệu sống dài là đặc biệt rắc rối? Có một cái nhìn tốt về bất kỳ danh sách và từ điển nào - chúng có thể phát triển mà không có giới hạn. Trong từ điển, bạn thậm chí có thể không thấy rắc rối đến từ khi bạn truy cập các dicts, số lượng khóa trong từ điển có thể không có khả năng hiển thị lớn đối với bạn ...

Đã trả lời ngày 16 tháng 9 năm 2009 lúc 21:08Sep 16, 2009 at 21:08

Hướng dẫn python garbage collection memory leak - Rò rỉ bộ nhớ thu gom rác python

JuergenjuergenJuergen

Huy hiệu vàng 12K738 Huy hiệu bạc55 Huy hiệu đồng7 gold badges38 silver badges55 bronze badges

Để phát hiện và xác định vị trí rò rỉ bộ nhớ cho các quá trình chạy dài, ví dụ: Trong môi trường sản xuất, bây giờ bạn có thể sử dụng Stackimpact. Nó sử dụng tracemalloc bên dưới. Xem thêm thông tin trong bài viết này.

Hướng dẫn python garbage collection memory leak - Rò rỉ bộ nhớ thu gom rác python

Đã trả lời ngày 1 tháng 7 năm 2017 lúc 8:05Jul 1, 2017 at 8:05

LogixLogixlogix

4967 Huy hiệu bạc9 Huy hiệu Đồng7 silver badges9 bronze badges

Theo như thực tiễn tốt nhất, hãy để mắt đến các chức năng đệ quy. Trong trường hợp của tôi, tôi đã gặp các vấn đề với đệ quy (nơi không cần phải có). Một ví dụ đơn giản hóa về những gì tôi đang làm:

def my_function():
    # lots of memory intensive operations
    # like operating on images or huge dictionaries and lists
    .....
    my_flag = True
    if my_flag:  # restart the function if a certain flag is true
        my_function()

def main():
    my_function()

Hoạt động theo cách đệ quy này sẽ không kích hoạt bộ sưu tập rác và xóa phần còn lại của chức năng, vì vậy mỗi lần thông qua việc sử dụng bộ nhớ đang phát triển và phát triển.

Giải pháp của tôi là rút cuộc gọi đệ quy ra khỏi my_function () và có xử lý chính () khi gọi lại. Bằng cách này, chức năng kết thúc một cách tự nhiên và làm sạch sau đó.

def my_function():
    # lots of memory intensive operations
    # like operating on images or huge dictionaries and lists
    .....
    my_flag = True
    .....
    return my_flag

def main():
    result = my_function()
    if result:
        my_function()

Đã trả lời ngày 3 tháng 3 năm 2017 lúc 21:55Mar 3, 2017 at 21:55

Hướng dẫn python garbage collection memory leak - Rò rỉ bộ nhớ thu gom rác python

The4thIcemanThe4thIcemanThe4thIceman

3,4712 Huy hiệu vàng27 Huy hiệu bạc33 Huy hiệu Đồng2 gold badges27 silver badges33 bronze badges

1

Không chắc chắn về "thực tiễn tốt nhất" cho rò rỉ bộ nhớ trong Python, nhưng Python nên xóa bộ nhớ của chính nó bởi bộ sưu tập rác. Vì vậy, chủ yếu tôi sẽ bắt đầu bằng cách kiểm tra danh sách tròn của một số ngắn, vì chúng sẽ không được người thu gom rác nhặt.

Đã trả lời ngày 16 tháng 9 năm 2009 lúc 20:59Sep 16, 2009 at 20:59

Martiertmartiertmartiert

1.6362 huy hiệu vàng18 Huy hiệu bạc23 Huy hiệu đồng2 gold badges18 silver badges23 bronze badges

2

Đây không phải là lời khuyên đầy đủ. Nhưng điều cần lưu ý khi viết với ý nghĩ tránh rò rỉ bộ nhớ trong tương lai (vòng lặp) là đảm bảo rằng bất cứ điều gì chấp nhận tham chiếu đến một cuộc gọi, nên lưu trữ lại đó như một tài liệu tham khảo yếu.

Đã trả lời ngày 19 tháng 2 năm 2012 lúc 20:32Feb 19, 2012 at 20:32

2

Làm thế nào để bạn sửa chữa rò rỉ bộ nhớ trong Python?

Khắc phục rò rỉ bộ nhớ:..
Nhận và lưu trữ số lượng đối tượng, được theo dõi (tạo và sống) bởi người sưu tầm. ....
Gọi chức năng gọi yêu cầu. ....
In mã trạng thái phản hồi, để chúng ta có thể xác nhận rằng đối tượng được tạo ..
Sau đó trả lại chức năng ..

Bộ sưu tập rác có tránh rò rỉ bộ nhớ không?

Rò rỉ bộ nhớ là một tình huống có các đối tượng có trong đống không còn được sử dụng, nhưng bộ thu gom rác không thể loại bỏ chúng khỏi bộ nhớ, và do đó, chúng được duy trì một cách không cần thiết.Rò rỉ bộ nhớ là xấu vì nó chặn tài nguyên bộ nhớ và làm suy giảm hiệu suất hệ thống theo thời gian.the garbage collector is unable to remove them from memory, and therefore, they're unnecessarily maintained. A memory leak is bad because it blocks memory resources and degrades system performance over time.

Làm thế nào để bạn kiểm tra rò rỉ bộ nhớ trong Python?

Bạn có thể phát hiện rò rỉ bộ nhớ trong Python bằng cách theo dõi hiệu suất của ứng dụng Python của bạn thông qua một công cụ giám sát hiệu suất ứng dụng như Scout APM.Khi bạn phát hiện rò rỉ bộ nhớ, có nhiều cách để giải quyết nó.monitoring your Python app's performance via an Application Performance Monitoring tool such as Scout APM. Once you detect a memory leak, there are multiple ways to solve it.

Làm cách nào để sử dụng tracemalloc trong Python?

Để theo dõi hầu hết các khối bộ nhớ được phân bổ bởi Python, mô -đun nên được bắt đầu càng sớm càng tốt bằng cách đặt biến môi trường Pythontracemalloc thành 1 hoặc bằng cách sử dụng tùy chọn dòng lệnh -X Tracemalloc.Tracemalloc.Hàm start () có thể được gọi vào thời gian chạy để bắt đầu phân bổ bộ nhớ python.setting the PYTHONTRACEMALLOC environment variable to 1 , or by using -X tracemalloc command line option. The tracemalloc. start() function can be called at runtime to start tracing Python memory allocations.