Giải phóng bộ nhớ Python
Không giống như các ngôn ngữ như C, phần lớn thời gian Python sẽ giải phóng bộ nhớ cho bạn. Nhưng đôi khi, nó sẽ không hoạt động theo cách bạn mong đợi Show
Hãy xem xét chương trình Python sau—bạn nghĩ nó sẽ sử dụng tối đa bao nhiêu bộ nhớ?
Giả sử chúng tôi không thể thay đổi dữ liệu gốc, điều tốt nhất chúng tôi có thể làm là bộ nhớ tối đa 2GB. trong một khoảng thời gian ngắn, cả 1GB dữ liệu gốc và bản sao dữ liệu đã sửa đổi sẽ cần phải có mặt. Trên thực tế, mức sử dụng cao nhất thực tế sẽ là 3GB—ở dưới xuống, bạn sẽ thấy kết quả lập hồ sơ bộ nhớ thực tế chứng minh rằng Điều tốt nhất chúng tôi có thể làm là 2GB, mức sử dụng thực tế là 3GB. 1GB sử dụng bộ nhớ bổ sung đó đến từ đâu? Để hiểu tại sao và những gì bạn có thể làm để khắc phục nó, bài viết này sẽ đề cập đến
Cách quản lý bộ nhớ tự động của Python giúp cuộc sống của bạn dễ dàng hơnTrong một số ngôn ngữ lập trình, bạn cần giải phóng rõ ràng bất kỳ bộ nhớ nào bạn đã phân bổ. Ví dụ, một chương trình C có thể làm
Nếu bạn không 6 thủ công bộ nhớ được cấp phát bởi 0, nó sẽ không bao giờ được giải phóngNgượ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 nữa. Nhưng đôi khi điều đó không thành công và để hiểu tại sao bạn cần hiểu cách nó theo dõi chúng Đối với phép tính gần đúng đầu tiên, việc triển khai Python mặc định thực hiện điều này bằng cách sử dụng phép đếm tham chiếu
Có một số cơ chế bổ sung (“thu gom rác”) để xử lý các tham chiếu vòng tròn, nhưng những cơ chế này không liên quan đến chủ đề hiện tại Cách các chức năng tương tác với quản lý bộ nhớ PythonMột cách bạn có thể thêm một tham chiếu đến một đối tượng là thêm nó vào một đối tượng khác. một danh sách, một từ điển, một thuộc tính của một thể hiện của lớp, v.v. Nhưng các tham chiếu cũng được tạo bởi các biến cục bộ trong các hàm Hãy xem một ví dụ
Giả sử chúng ta gọi 1 và xem qua mã từng bước
Ở dạng văn xuôi
Bây giờ hãy xem lại mã đó, ở cấp độ ngữ nghĩa. Sau khi từ điển được chuyển cho 8, nó sẽ không bao giờ được sử dụng bởi 1 nữa—tuy nhiên, vẫn có một tham chiếu từ 1 do biến 3, đó là lý do tại sao số lượng tham chiếu là 2. Tham chiếu của biến cục bộ sẽ không bao giờ biến mất cho đến khi 1 thoát, mặc dù 1 đã sử dụng xongGiờ đây, việc lưu giữ một từ điển nhỏ trong bộ nhớ lâu hơn một chút không thực sự là vấn đề. Nhưng nếu đối tượng đó sử dụng nhiều bộ nhớ thì sao? Thêm 1GBHãy quay lại mã ban đầu của chúng tôi, nơi chúng tôi có thêm 1GB bộ nhớ sử dụng ngoài dự kiến. Tóm lại 4Nếu chúng tôi cấu hình nó bằng trình cấu hình bộ nhớ Fil để nhận phân bổ tại thời điểm sử dụng bộ nhớ cao nhất, đây là những gì chúng tôi sẽ nhận được Vào lúc cao điểm, chúng tôi sử dụng 3GB do ba lần phân bổ;
Vấn đề là phân bổ đầu tiên. chúng tôi không cần nó nữa khi 2 đã tạo phiên bản sửa đổi. Nhưng vì biến cục bộ 6 trong 7, nó không được giải phóng khỏi bộ nhớ cho đến khi 7 trả về. Và điều đó có nghĩa là mức sử dụng bộ nhớ cao hơn 1GB so với mức bình thườngCác giải pháp. Làm cho các chức năng buông bỏVấn đề của chúng tôi là 7 đang giữ mảng ban đầu quá lâu 5Do đó, các giải pháp liên quan đến việc đảm bảo rằng biến cục bộ 6 không giữ mảng ban đầu lâu hơn mức cần thiếtGiải pháp số 1. Không có biến cục bộ nào cảNếu không có tham chiếu bổ sung, mảng ban đầu có thể bị xóa khỏi bộ nhớ ngay khi nó không được sử dụng 7Hiện tại, không có tham chiếu 6 nào giữ nguyên 1GB dữ liệu ban đầu và mức sử dụng bộ nhớ cao nhất sẽ là 2GBGiải pháp số 2. Sử dụng lại biến cục bộChúng ta có thể thay thế rõ ràng 6 bằng kết quả của 2 1Một lần nữa, chúng tôi kết thúc với bộ nhớ tối đa 2GB, vì mảng ban đầu có thể được giải phóng ngay sau khi 2 kết thúcGiải pháp số 3. Chuyển quyền sở hữu đối tượngĐây là một thủ thuật vay mượn từ C++. chúng tôi có một đối tượng có nhiệm vụ sở hữu khối dữ liệu lớn 1GB và chúng tôi chuyển chủ sở hữu thay vì đối tượng ban đầu 3Bí quyết là 7 không còn tham chiếu đến khối dữ liệu lớn nữa mà thay vào đó là chủ sở hữu—và sau đó 46 sẽ xóa/đặt lại chủ sở hữu sau khi trích xuất dữ liệu cần thiếtTheo dõi tham chiếu đối tượngTrong mã bình thường, việc các đối tượng tồn tại lâu hơn một chút không thành vấn đề. Nhưng khi một đối tượng sử dụng nhiều gigabyte RAM, việc tồn tại quá lâu có thể khiến chương trình của bạn hết bộ nhớ hoặc yêu cầu trả tiền để mua thêm phần cứng Vì vậy, hãy tập thói quen theo dõi trong đầu xem các tham chiếu đến các đối tượng nằm ở đâu. Và nếu mức sử dụng bộ nhớ quá cao và trình lược tả gợi ý các tham chiếu cấp chức năng là vấn đề, hãy thử một trong các kỹ thuật trên Tìm hiểu thêm các kỹ thuật để giảm mức sử dụng bộ nhớ—đọc phần còn lại của hướng dẫn Bộ dữ liệu lớn hơn bộ nhớ dành cho PythonBài viết tiếp theo. Chi phí bộ nhớ lớn. Số trong Python và cách NumPy hỗ trợ Xử lý dữ liệu quá chậm?Bạn có thể nhận được kết quả nhanh hơn từ quy trình khoa học dữ liệu của mình—và cũng nhận lại được một số tiền—nếu bạn có thể tìm ra lý do tại sao mã của mình chạy chậm Xác định các nút thắt cổ chai hiệu suất và ngốn bộ nhớ trong khoa học dữ liệu sản xuất của bạn Các công việc Python với Sciagraph, trình lược tả luôn bật cho các công việc sản xuất hàng loạt Tìm hiểu các kỹ năng kỹ thuật phần mềm Python thực tế mà bạn có thể sử dụng trong công việc của mìnhĐăng ký nhận bản tin của tôi và tham gia cùng hơn 6500 nhà phát triển Python và nhà khoa học dữ liệu học các công cụ và kỹ thuật thực tế, từ hiệu suất Python đến đóng gói Docker, với một bài viết mới miễn phí trong hộp thư đến của bạn mỗi tuần 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 có giải phóng bộ nhớ sau chức năng không?Quản lý bộ 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 does not necessarily release the memory back to the Operating System. Instead, it has a dedicated object allocator for objects smaller than 512 bytes, which keeps some chunks of already allocated memory for further use in the future.
Python có tự động xóa 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ớ .
Cách chính xác để giải phóng bộ nhớ trong Python là gì?Phương thức cấp phát và hủy bỏ bộ nhớ của Python là tự động . Người dùng không phải phân bổ trước hoặc phân bổ lại bộ nhớ bằng tay như khi sử dụng phân bổ bộ nhớ động trong các ngôn ngữ như C hoặc C++. Python sử dụng hai chiến lược để đếm tham chiếu cấp phát bộ nhớ và thu gom rác. |