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ớ

Để 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 gc.collect(generation=2) được sử dụng để xóa hoặc giải phóng bộ nhớ không được ước tính trong Python. Bộ nhớ không tham chiếu là bộ nhớ không thể truy cập và không thể sử dụng. Đối số tùy chọn generation là một số nguyên có giá trị nằm trong khoảng từ 0 đến 2. Nó chỉ định việc tạo các đối tượng để thu thập bằng phương thức gc.collect()

Trong Python, các đối tượng tồn tại trong thời gian ngắn được lưu trữ trong thế hệ 0 và các đối tượng có thời gian tồn tại lâu hơn được lưu trữ trong thế hệ

import numpy as np

a= np.array([1,2,3])
del a
print(a)
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ọi

Phương thức gc.collect() có thể giúp giảm mức sử dụng bộ nhớ và xóa bộ nhớ không được ước tính trong quá trình thực thi chương trình. Nó có thể ngăn chương trình hết bộ nhớ và bị sập bằng cách xóa dữ liệu không thể truy cập của bộ nhớ

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) 7

Cùng với phương thức gc.collect(), câu lệnh

import numpy as np

a= np.array([1,2,3])
del a
print(a)
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
import numpy as np

a= np.array([1,2,3])
del a
print(a)
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

import numpy as np

a= np.array([1,2,3])
del a
print(a)
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
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?. **

Bạn sẽ làm điều đó như thế nào từ bất kỳ quy trình nào khác? .
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).

--
Wulfraed Dennis Lee Bieber AF6VN
***@ix. netcom. com HTTP. //wlfraed. Trang Chủ. netcom. com/

Oscar Benjamin

2016-04-15 13. 02. 30 UTC

liên kết cố định

Bài viết của c***@gmail. com
Đầu vào là tệp 4 MB. 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ó.

Không rõ chính xác thời điểm bộ nhớ được giải phóng cho hệ điều hành nhưng có thể
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
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?. **

I don't really understand what you're asking here. You're running
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
Đầu vào là tệp 4 MB. Ngay cả sau khi quay lại từ chức năng 'fileopen'
, bộ nhớ 4MB 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ó.

Tôi đoán câu hỏi là, tại sao đây lại là một vấn đề? . Và quả thực bạn
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
Vì vậy, nếu celery worker không bị giết sau khi hoàn thành nhiệm vụ thì 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 quy trình và tạo
quy trình mới. **Có cách nào khác để trả lại bộ nhớ cho hệ điều hành từ
tiến trình python không?. **

Have you tried using the subprocess module of python? If I understand it
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
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
# trả lại mức sử dụng bộ nhớ tính bằng MB
nhập tài nguyên
print 'Bộ nhớ . %s (MB)' % (tài nguyên. getrusage(tài nguyên. RUSAGE_SELF). ru_maxrss / 1000. 0)
memory_usage_psutil()# 10 MB
f = open(fname)
memory_usage_psutil()# 10 MB
content = f.read()
memory_usage_psutil()# 14 MB
memory_usage_psutil() # 10 MB
fileopen(fname)
gc.collect()
memory_usage_psutil() # 14 MB
nhập sys
từ thời điểm nhập ngủ
fun(sys.argv[1])
gc. coll()
memory_usage_psutil()#14 MB.
sleep(1)
Đầu vào là tệp 4 MB. 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?. **

Với những tình huống như thế này, tôi thường chỉ rẽ nhánh và thực hiện công việc chuyên sâu về mem
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 .