Làm cách nào để tăng giới hạn bộ nhớ trong 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 về 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 Làm thế nào để cải thiện bộ nhớ Python?Tệp được sử dụng nhiều nhất là đối tượng mảng chiếm 2 khối bộ nhớ với tổng kích thước là 2637 MiB. . Sử dụng Trình tải dữ liệu Pytorch. . Loại dữ liệu được tối ưu hóa. . Tránh sử dụng các biến toàn cục, thay vào đó sử dụng các đối tượng cục bộ. . Sử dụng từ khóa năng suất. . Các phương pháp Tối ưu hóa tích hợp của Python. . Chi phí khai báo nhập khẩu. . đoạn dữ liệu Giới hạn bộ nhớ vượt quá trong Python là gì?Lỗi vượt quá giới hạn bộ nhớ. Điều này thường xảy ra khi không có giới hạn bộ nhớ nào được đặt . Điều đó có nghĩa là chương trình đang cố cấp phát nhiều bộ nhớ hơn giới hạn bộ nhớ cho sự cố cụ thể. Ví dụ: nếu giới hạn bộ nhớ là 256 MB, thì không cần viết mã yêu cầu nhiều hơn 256 MB bộ nhớ.
Python có thể hết bộ nhớ không?Lỗi bộ nhớ có nghĩa là trình thông dịch đã hết bộ nhớ để phân bổ cho chương trình Python của bạn . Điều này có thể là do sự cố trong quá trình thiết lập môi trường Python hoặc có thể do bản thân mã tải quá nhiều dữ liệu cùng một lúc.
Python có thể phân bổ bao nhiêu bộ nhớ?Python có bộ cấp phát pymalloc được tối ưu hóa cho các đối tượng nhỏ (nhỏ hơn hoặc bằng 512 byte ) với thời gian tồn tại ngắn. Nó sử dụng ánh xạ bộ nhớ được gọi là "đấu trường" với kích thước cố định là 256 KiB. |