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