2016-02-10 11 views
7

Tôi có hàng trăm ma trận thực sự lớn, như (600, 800) hoặc (3, 600, 800) hình dạng.Cài đặt mảng có nhiều mảng thành Không có bộ nhớ trống?

Vì vậy, tôi muốn phân bổ bộ nhớ được sử dụng ngay sau khi tôi không thực sự cần thứ gì đó nữa.

tôi nghĩ:

some_matrix = None 

nên thực hiện công việc, hoặc chỉ là tài liệu tham khảo thiết lập để None nhưng đâu đó trong bộ nhớ không gian vẫn được phân bổ? (như bảo quản không gian được cấp cho một số lần khởi tạo lại some_matrix trong tương lai)

Ngoài ra: đôi khi tôi cắt qua các ma trận, tính toán một cái gì đó và đặt giá trị vào bộ đệm (danh sách, vì nó được nối thêm tất cả thời gian). Vì vậy, việc thiết lập một danh sách thành None sẽ chắc chắn giải phóng bộ nhớ, đúng không?

Hoặc có một số loại phương pháp unset() tồn tại nơi toàn bộ số nhận dạng cộng với các đối tượng được tham chiếu của nó bị "xóa"?

Trả lời

8

Bạn chắc chắn muốn xem qua số garbage collection. Không giống như một số ngôn ngữ lập trình như C/C++, nơi lập trình viên phải tự do cấp phát bộ nhớ tự động khi không gian không còn cần thiết nữa, python có một bộ sưu tập rác. Có nghĩa là python tự giải phóng bộ nhớ khi necessary.

Khi bạn sử dụng some_matrix = None, bạn hủy liên kết biến khỏi không gian bộ nhớ; bộ đếm tham chiếu bị giảm và nếu nó đạt đến 0, bộ thu gom rác sẽ giải phóng bộ nhớ. Khi bạn sử dụng del some_matrix theo đề xuất của MSeifert, bộ nhớ không được giải phóng ngay lập tức như trái ngược với câu trả lời cho biết.Theo python doc, đây là những gì sẽ xảy ra:

Xóa một tên loại bỏ các ràng buộc của cái tên đó từ không gian tên địa phương hay toàn cầu

gì đã xảy ra dưới mui xe được rằng các truy cập của tài liệu tham khảo cho dung lượng bộ nhớ bị giảm bởi 1 độc lập với việc gán None hoặc sử dụng del. Khi bộ đếm này đạt đến số 0, bộ thu gom rác sẽ free không gian bộ nhớ trong tương lai. Sự khác biệt duy nhất là khi sử dụng del, rõ ràng là trong bối cảnh bạn không cần tên nữa.

Nếu bạn nhìn vào tài liệu của bộ sưu tập rác, bạn sẽ thấy rằng bạn có thể tự gọi nó hoặc thay đổi một số tham số của nó.

3

Numpy xóa mảng khi bộ đếm tham chiếu bằng không (hoặc ít nhất nó theo dõi bộ đếm tham chiếu và để hệ điều hành thu thập rác).

Ví dụ có

import numpy as np 
a = np.linspace(0,100, 10000000) 
a = None 

sẽ giải phóng bộ nhớ "immediatly" (theo cách ưa thích đang viết del a dù) trong khi

import numpy as np 
a = np.linspace(0,100, 10000000) 
b = a 
a = None 

sẽ giải phóng không có gì.


Bạn cũng đã đề cập đến việc cắt. Cắt chỉ là một cái nhìn trên dữ liệu và do đó chính xác như ví dụ thứ hai. Nếu bạn không xóa cả hai biến tham chiếu cùng một mảng thì hệ điều hành sẽ giữ lại các mảng.

Nếu tôi làm điều gì đó rất tốn kém, tôi sẽ luôn gắn bó với các chức năng riêng biệt thực hiện thao tác và chỉ trả lại những gì thực sự cần thiết. Chức năng làm sạch sau khi họ để bất kỳ kết quả trung gian được giải phóng (Nếu họ không được trả lại).

+0

Cảm ơn bạn đã làm rõ các chức năng/phương pháp. Tôi đã giả định rằng các biến cục bộ được vứt bỏ sau câu lệnh trả về (như trong Java hoặc các ngôn ngữ khác) nhưng thật tuyệt khi biết rằng Python thực sự thực hiện chính xác điều tương tự ở đó. Tuy nhiên, 'del some_array' hoặc thường' del some_variable' phải luôn là lựa chọn đầu tiên cho bộ nhớ giải phóng một cách rõ ràng ?! – daniel451

+0

'' del'' xóa tên biến, vì vậy bất kỳ thao tác nào sau đó bao gồm biến đã xóa sẽ làm tăng lỗi. Mặt khác '' a = None'' giữ biến '' a'' để bạn "có thể" vô tình sử dụng nó sau này và không nhận ra rằng nó thực sự bị "xóa". – MSeifert

+0

Ok, cảm ơn. Tuy nhiên, kịch bản thứ hai sẽ không giải phóng bất cứ thứ gì với 'del' nữa ?! Do đó, 'del' đang xóa số nhận dạng cộng với tham chiếu của nó nhưng đối tượng đằng sau tham chiếu chỉ bị xóa khi không có số nhận dạng nào khác tham chiếu đến nó nữa, đúng không? Vì vậy, miễn là bất kỳ số nhận dạng nào khác tham chiếu đối tượng, như 'b' trong ví dụ của bạn, trình thu gom rác sẽ không xóa đối tượng ?! – daniel451

Các vấn đề liên quan