Bộ nhớ được giải phóng trong Python như thế nào?

Thông thường, với tư cách là nhà phát triển, bạn phải viết một chương trình xử lý rất nhiều tài liệu, xử lý khối lượng dữ liệu và thông tin khổng lồ, đồng thời lưu giữ dữ liệu trong bộ nhớ. Do đó, điều này dẫn đến tình trạng thiếu dung lượng bộ nhớ, ảnh hưởng đến hiệu suất tổng thể của mã của bạn.  

Để tránh tình trạng thiếu bộ nhớ, bạn phải xóa bộ nhớ bằng cách xóa dữ liệu hoặc thông tin không còn cần thiết trong chương trình. Hướng dẫn này sẽ hướng dẫn bạn cách cấp phát bộ nhớ và các phương pháp khác nhau để xóa bộ nhớ trong Python

✨Bộ nhớ được phân bổ như thế nào trong Python?

Trong Python, mọi thứ đều là đối tượng. Các đối tượng này được lưu trữ trong bộ nhớ được truy cập. Trước khi các đối tượng có thể được lưu trữ trong bộ nhớ, ban đầu một khối bộ nhớ được phân bổ. Bộ cấp phát bộ nhớ của Python đảm bảo rằng có không gian trống để lưu trữ các đối tượng này. Đối với điều này, nó tương tác với quản trị viên bộ nhớ của hệ điều hành của bạn

Python sử dụng cấp phát bộ nhớ động. Một lợi ích của việc này là nó cho biết trước bạn cần bao nhiêu bộ nhớ cho chương trình của mình. Một lợi ích khác là có thể thao tác cấu trúc dữ liệu vì bạn có thể phân bổ bộ nhớ theo nhu cầu của mình nếu cấu trúc dữ liệu mở rộng. Tuy nhiên, đồng tiền nào cũng có hai mặt. Vì cấp phát bộ nhớ động tiếp tục miễn là chương trình ở trạng thái thực thi, nó sẽ tiêu tốn nhiều thời gian hơn. Tương tự như vậy, bộ nhớ đã được sử dụng nên được giải phóng sau khi nó được sử dụng để khắc phục nhược điểm này.  

✨Thu gom rác bằng Python

Trong Python, bạn không thể giải phóng bộ nhớ một cách rõ ràng. Để xóa bộ nhớ, bạn phải đảm bảo rằng bạn không tiếp tục lưu trữ các tham chiếu đến các đối tượng. Điều này sẽ đảm bảo rằng bộ nhớ sẽ bị xóa khi chúng được thu gom rác. Thu gom rác được thực hiện bởi một chương trình để xóa bộ nhớ trước đó cho một đối tượng không được sử dụng

Do các chu kỳ tham chiếu thực hiện công việc tính toán nên việc thu gom rác phải tự động. Trong Python, việc thu gom rác phụ thuộc vào việc phân bổ và hủy phân bổ đối tượng. Nó giúp tiết kiệm rất nhiều vấn đề tương ứng với việc quản lý cấp phát và hủy cấp phát bộ nhớ theo cách thủ công. Đặc biệt, Python sử dụng tính năng đếm tham chiếu cùng với bộ sưu tập rác để xóa bộ nhớ không sử dụng.  

Bây giờ, tính tham chiếu là gì??

?Tham khảo Đếm

Bất cứ khi nào nhà phát triển tạo một đối tượng trong Python, đối tượng bên dưới sẽ có cả đối tượng tham chiếu và loại Python của nó như danh sách, từ điển, v.v. Khi đối tượng được tham chiếu trong chương trình, số lượng tham chiếu của nó sẽ tăng lên và nó sẽ giảm đi khi một đối tượng bị hủy đăng ký. Trong trường hợp số lượng tham chiếu của một đối tượng trở thành 0, bộ nhớ cho đối tượng sẽ bị giải phóng.  

Làm thế nào để xem số lượng tài liệu tham khảo?

Người ta có thể kiểm tra số lượng tham chiếu của một đối tượng cụ thể trong Python bằng cách nhập mô-đun sys. Kiểm tra số lượng tham chiếu của một biến như trong ví dụ sau

>>> import sys
>>> x = 'hello'
>>> sys.getrefcount[x]

# 2

Ghi chú. Số lượng tham chiếu là hai vì chúng tôi đã tạo biến đầu tiên và sau đó nó được chuyển đến sys. hàm getrefcount[]

✨Thu gom rác tự động bằng Mô-đun gc

Chúng ta cũng có thể kiểm tra ngưỡng cho các đối tượng mới [các đối tượng trong Python được gọi là đối tượng thế hệ 0] bằng cách tải mô-đun gc và yêu cầu ngưỡng thu gom rác

import gc
print["Garbage collection thresholds: " gc.get_threshold[]]
Garbage collection thresholds: [500, 10, 10]

Hệ thống trên có ngưỡng mặc định là 500. Nó ngụ ý rằng khi số lượng phân bổ lớn hơn 500 so với số lượng hủy phân bổ, thì bộ thu gom rác tự động sẽ bắt đầu chạy

Thí dụ

import gc
import pprint
import sys
try:
    threshold = int[sys.argv[1]]
except [IndexError, ValueError, TypeError]:
    print 'Invalid threshold'
    threshold = 5
class MyObj[object]:
    def __init__[self, name]:
        self.name = name
        print 'Created', self.name
gc.set_debug[gc.DEBUG_STATS]
gc.set_threshold[threshold, 1, 1]
print 'Thresholds:', gc.get_threshold[]
print 'Clearing the collector'
gc.collect[]
print
print 'Creating objects'
objs = []
for i in range[10]:
    objs.append[MyObj[i]]

đầu ra

Thresholds: [5, 1, 1]
Clearing the collector
gc: collecting generation 2...
gc: objects in each generation: 218 2683 0
gc: done, 0.0007s elapsed.
Creating objects
gc: collecting generation 0...
gc: objects in each generation: 7 0 2920
gc: done, 0.0000s elapsed.
Created 0
Created 1
Created 2
Created 3
Created 4
gc: collecting generation 0...
gc: objects in each generation: 6 4 2820
gc: done, 0.0000s elapsed.
Created 5
Created 6
Created 7
Created 8
Created 9
gc: collecting generation 2...
gc: objects in each generation: 5 6 2817
gc: done, 0.0005s elapsed.

Ghi chú. Thu gom rác tự động sẽ không chạy nếu thiết bị của bạn sắp hết bộ nhớ; . Theo cách này, bất kỳ phần nào trong mã của bạn giải phóng một khối bộ nhớ khổng lồ đều có khả năng chạy thu gom rác thủ công

✨Thu gom rác thủ công bằng gc. sưu tầm[]

Ứng dụng phải được giải phóng khỏi các chu kỳ tham chiếu càng tốt. Gọi trình thu gom rác theo cách thủ công trong quá trình thực thi chương trình là cách tốt nhất để xử lý bộ nhớ bị tiêu tốn bởi các chu kỳ tham chiếu. Để gọi trình thu gom rác theo cách thủ công, bạn có thể sử dụng hàm gc. sưu tầm[]. các gc. Phương thức coll[] được sử dụng để trả về số lượng đối tượng mà nó đã thu thập và cấp phát lại trong quá trình thực thi chương trình. Chúng ta có thể gọi trình thu thập bằng cách sau


nhập gc
x = gc. thu thập[]

Thí dụ

import gc
import pprint
class Graph[object]:
    def __init__[self, name]:
        self.name = name
        self.next = None
    def set_next[self, next]:
        print['Linking nodes %s.next = %s' % [self, next]]
        self.next = next
    def __repr__[self]:
        return '%s[%s]' % [self.__class__.__name__, self.name]
# Construct a graph cycle
one = Graph['one']
two = Graph['two']
three = Graph['three']
one.set_next[two]
two.set_next[three]
three.set_next[one]
print[]
# Remove references to the graph nodes in this module's namespace
one = two = three = None
# Show the effect of garbage collection
for i in range[2]:
    print['Collecting %d ...' % i]
    n = gc.collect[]
    print['Unreachable objects:', n]
    print['Remaining Garbage:', end=' ']
    pprint.pprint[gc.garbage]
    print[]

đầu ra

Linking nodes Graph[one].next = Graph[two]
Linking nodes Graph[two].next = Graph[three]
Linking nodes Graph[three].next = Graph[one]

Collecting 0 ...
Unreachable objects: 6
Remaining Garbage: []

Collecting 1 ...
Unreachable objects: 0
Remaining Garbage: []

Trong chương trình trên, chu trình bị xóa khi bộ sưu tập rác chạy trong thời gian đầu vì không có gì đề cập đến các nút Đồ thị ngoài chính chúng. các gc. Phương thức coll[] trả về số lượng đối tượng không thể truy cập được tìm thấy.  

Vui lòng tiếp tục theo dõi và đăng ký để biết thêm các giải pháp và các cuộc thảo luận thú vị trong tương lai. học tập vui vẻ

Đi đâu từ đây?

Đủ lý thuyết. Hãy thực hành một số

Các lập trình viên được trả sáu con số trở lên vì họ có thể giải quyết vấn đề hiệu quả hơn bằng cách sử dụng trí thông minh máy móc và tự động hóa

Để trở nên thành công hơn trong việc viết mã, hãy giải quyết nhiều vấn đề thực tế hơn cho người thực. Đó là cách bạn trau dồi những kỹ năng bạn thực sự cần trong thực tế. Rốt cuộc, việc sử dụng lý thuyết học tập mà không ai cần là gì?

Bạn xây dựng các kỹ năng mã hóa có giá trị cao bằng cách làm việc trên các dự án mã hóa thực tế

Bạn có muốn ngừng học với các dự án đồ chơi và tập trung vào các dự án mã thực tế giúp bạn kiếm tiền và giải quyết các vấn đề thực sự cho mọi người không?

🚀 Nếu câu trả lời của bạn là CÓ. , cân nhắc trở thành nhà phát triển Python tự do. Đó là cách tốt nhất để tiếp cận nhiệm vụ cải thiện kỹ năng Python của bạn—ngay cả khi bạn là người mới hoàn toàn

Nếu bạn chỉ muốn tìm hiểu về cơ hội làm việc tự do, vui lòng xem hội thảo trên web miễn phí của tôi “Cách xây dựng kỹ năng Python có thu nhập cao của bạn” và tìm hiểu cách tôi phát triển công việc viết mã của mình trực tuyến cũng như cách bạn có thể làm được—từ sự thoải mái của bạn

Tham gia hội thảo trên web miễn phí ngay bây giờ

Shubham Sayon

Tôi là một người tạo nội dung và Blogger Python chuyên nghiệp. Tôi đã xuất bản nhiều bài báo và tạo các khóa học trong một khoảng thời gian. Hiện tại tôi đang làm việc với tư cách là một freelancer toàn thời gian và tôi có kinh nghiệm trong các lĩnh vực như Python, AWS, DevOps và Networking

Chúng ta có thể giải phóng bộ nhớ trong Python không?

Thu gom rác bằng Python . Điều này sẽ đảm bảo rằng bộ nhớ sẽ bị xóa khi chúng được thu gom rác. Thu gom rác được thực hiện bởi một chương trình để xóa bộ nhớ trước đó cho một đối tượng không được sử dụng. To clear memory, you have to ensure that you don't keep storing the references to the objects. This will ensure that the memory gets cleared when they are garbage-collected. Garbage collection is carried out by a program to clear the previous memory for an object that is not being used.

Python quản lý bộ nhớ như thế nào?

Quản lý bộ nhớ trong Python liên quan đến một đống riêng chứa tất cả các đối tượng Python và cấu trúc dữ liệu . Việc quản lý vùng riêng tư này được đảm bảo nội bộ bởi trình quản lý bộ nhớ Python.

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 xử lý các vấn đề về bộ nhớ như thế nào?

Bạn sẽ phải gỡ lỗi sử dụng bộ nhớ trong Python bằng mô-đun có sẵn trình thu gom rác . Điều đó sẽ cung cấp cho bạn một danh sách các đối tượng được người thu gom rác biết đến. Gỡ lỗi cho phép bạn xem phần lớn bộ nhớ lưu trữ Python đang được áp dụng. Sau đó, bạn có thể tiếp tục và lọc mọi thứ dựa trên mức sử dụng.

Chủ Đề