Python giải phóng bộ nhớ cho hệ điều hành
Hướng dẫn này sẽ xem xét các phương pháp giải phóng hoặc xóa bộ nhớ trong Python trong quá trình thực thi chương trình. Khi một chương trình phải xử lý các tệp lớn, xử lý một lượng lớn dữ liệu hoặc giữ dữ liệu trong bộ nhớ. Trong các loại tình huống này, chương trình thường có thể hết bộ nhớ Show
Để ngăn chương trình hết bộ nhớ, chúng ta phải giải phóng hoặc xóa bộ nhớ bằng cách xóa biến hoặc dữ liệu không còn cần thiết trong chương trình. Chúng ta có thể xóa bộ nhớ trong Python bằng các phương pháp sau Xóa bộ nhớ trong Python bằng phương pháp gc.collect()Phương thức Trong Python, các đối tượng tồn tại trong thời gian ngắn được lưu trữ trong thế hệ 1 hoặc 2 . Danh sách được duy trì bởi trình thu gom rác sẽ bị xóa bất cứ khi nào giá trị gc.collect() với giá trị generation mặc định bằng với 2 được gọiPhương thức Xóa bộ nhớ trong Python bằng câu lệnh import numpy as np a= np.array([1,2,3]) del a print(a) 7Cùng với phương thức 7 có thể khá hữu ích để xóa bộ nhớ trong quá trình thực thi chương trình của Python. Câu lệnh 7 dùng để xóa biến trong Python. Trước tiên chúng ta có thể xóa biến như một số danh sách lớn hoặc mảng, v.v. , về điều mà chúng tôi chắc chắn rằng chương trình không yêu cầu nữaĐoạn mã ví dụ dưới đây trình bày cách sử dụng câu lệnh 7 với phương thức gc.collect() để xóa bộ nhớ trong Python c***@gmail. com 2016-04-15 10. 25. 39 UTC liên kết cố định Tôi đã viết một ứng dụng bằng bình và sử dụng cần tây cho một tác vụ chạy dài. Trong khi kiểm tra tải, tôi nhận thấy rằng các tác vụ cần tây không giải phóng bộ nhớ ngay cả sau khi hoàn thành tác vụ. Vì vậy, tôi đã tìm kiếm trên google và tìm thấy cuộc thảo luận nhóm này.https. //các nhóm. Google. com/diễn đàn/#. topic/celery-users/jVc3I3kPtlw Trong cuộc thảo luận đó có nói, đó là cách python hoạt động. Cũng là bài viết tại https. //hbfs. báo chí. com/2013/01/08/python-memory-manager-part-ii/ nói "Nhưng từ quan điểm của HĐH, kích thước chương trình của bạn là tổng bộ nhớ (tối đa) được phân bổ cho Python. Vì Python chỉ trả lại bộ nhớ cho hệ điều hành trên heap (phân bổ các đối tượng khác ngoài các đối tượng nhỏ) trên Windows, nên nếu bạn chạy trên Linux, bạn chỉ có thể thấy tổng bộ nhớ mà chương trình của mình sử dụng tăng lên. " Và tôi sử dụng Linux. Vì vậy, tôi đã viết đoạn script dưới đây để xác minh nó. nhập gc def memory_usage_psutil(). # trả lại mức sử dụng bộ nhớ tính bằng MB nhập tài nguyên in 'Mức sử dụng bộ nhớ. %s (MB)' % (tài nguyên. getrusage(tài nguyên. RUSAGE_SELF). ru_maxrss / 1000. 0) def fileopen(fname). memory_usage_psutil()# 10 MB f = open(fname) memory_usage_psutil()# 10 MB content = f.read() memory_usage_psutil()# 14 MB def fun(fname). memory_usage_psutil() # 10 MB fileopen(fname) gc. coll() memory_usage_psutil() # 14 MB nhập hệ thống từ thời điểm nhập ngủ if __name__ == '__main__': vui vẻ(sys. argv[1]) for _ in range(60). gc. coll() memory_usage_psutil()#14 MB. sleep(1) Đầu vào là tệp 4MB. Ngay cả sau khi trở về từ chức năng 'fileopen', bộ nhớ 4 MB vẫn chưa được giải phóng. Tôi đã kiểm tra đầu ra htop trong khi vòng lặp đang chạy, bộ nhớ lưu trữ vẫn ở mức 14MB. Vì vậy, trừ khi quá trình bị dừng, bộ nhớ sẽ ở lại với nó. Vì vậy, nếu celery worker không bị giết sau khi hoàn thành nhiệm vụ, nó sẽ giữ bộ nhớ cho chính nó. Tôi biết tôi có thể sử dụng giá trị cấu hình **max_tasks_per_child** để hủy tiến trình và sinh ra một tiến trình mới. ** Có cách nào khác để trả lại bộ nhớ cho hệ điều hành từ quy trình python không?. ** Dennis Lee Bieber 2016-04-15 12. 24. 04 UTC liên kết cố định Bài viết của c***@gmail. com the Python devs would have considered adding it to the run-time. IOW, câu hỏi có nhiều khả năng là "hệ điều hành lấy lại bộ nhớ như thế nào từ các tiến trình đang chạy". Trong nhiều hệ điều hành -- nó chỉ thực hiện điều đó khi dọn sạch toàn bộ không gian quy trình. Bộ nhớ được cấp phát cho heap hiếm khi được lấy lại từng phần vì các đối tượng trong heap có thể nằm rải rác khắp phân bổ và không thể di chuyển. Không biết Windows có thể khác như thế nào. Có thể nó chỉ tính các trang thực sự có dữ liệu trực tiếp (nó xác định thế nào thì tôi không biết -- có thể malloc/miễn phí sử dụng nhóm toàn hệ thống . block of adjacent addresses is freed the entire page is returned to the system, even though the process thinks it is using a contiguous allotment). -- Oscar Benjamin 2016-04-15 13. 02. 30 UTC liên kết cố định Bài viết của c***@gmail. com quy trình của bạn có thể sử dụng lại cùng một bit bộ nhớ. Câu hỏi thực sự là liệu việc phân bổ và hủy phân bổ liên tục có dẫn đến việc sử dụng bộ nhớ ngày càng tăng không. Nếu bạn thay đổi nó để mã của bạn gọi fun trong vòng lặp, bạn sẽ thấy rằng việc gọi fun nhiều lần không dẫn đến tăng mức sử dụng bộ nhớ. Đăng bởi c***@gmail. com celery in a subprocess right? Is the problem about the memory used by subprocesses that aren't killed or is it the memory usage of the Python process? -- Oscar Micheal Torrie 2016-04-15 13. 59. 47 UTC liên kết cố định Bài viết của c***@gmail. com then I confess I don't understand what your concern is. And indeed you nói rằng nó không bị rò rỉ vì nó không bao giờ vượt quá 14 MB. Ngoài ra, có nhiều cách để đọc tệp mà không cần cấp phát một lượng lớn bộ nhớ. Tại sao không đọc nó theo từng đoạn, hoặc theo dòng. Tận dụng cơ sở tạo của Python để xử lý dữ liệu của bạn. Đăng bởi c***@gmail. com correctly, this would allow you to run python code as a subprocess (completely separate process), which would be completely reaped by the OS when it's finished. Sâm 2016-04-15 14. 27. 44 UTC liên kết cố định Bài viết của c***@gmail. com trong phần tử con và sau đó loại bỏ nó khi hoàn thành. Có thể sử dụng một chuỗi thay vì một ngã ba. Nhưng không chắc tất cả những thứ đó sẽ hoạt động tốt như thế nào với cần tây. --Sam Python có giải phóng bộ nhớ trở lại hệ điều hành không?Không giống như nhiều ngôn ngữ khác, Python không nhất thiết phải giải phóng bộ nhớ trở lại Hệ điều hành . Thay vào đó, nó có một bộ cấp phát đối tượng chuyên dụng cho các đối tượng nhỏ hơn 512 byte, giữ lại một số khối bộ nhớ đã được cấp phát để sử dụng thêm trong tương lai.
Python có tự động giải phóng bộ nhớ không?Lập trình viên phải cấp phát bộ nhớ theo cách thủ công trước khi chương trình có thể sử dụng bộ nhớ và giải phóng bộ nhớ khi chương trình không cần đến bộ nhớ đó nữa. Trong Python, quản lý bộ nhớ là tự động. Python tự động xử lý việc cấp phát và hủy cấp phát bộ nhớ .
Python có thể rò rỉ bộ nhớ không?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 thông qua 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.
Python có xóa bộ nhớ sau chức năng không?Nếu bạn không giải phóng thủ công() bộ nhớ được cấp phát bởi malloc() , nó sẽ không bao giờ được giải phóng. Ngược lại, Python theo dõi các đối tượng và tự động giải phóng bộ nhớ của chúng khi chúng không còn được sử dụng . |