Tôi định kỳ làm sạch bộ nhớ trong R bằng cách sử dụng lệnh gọi tới rm(list=ls())
.
Tôi có cần gọi cho người thu gom rác gc()
sau đó không?
Sự khác biệt giữa 2 chức năng này là gì? Có gc()
gọi rm()
cho các biến nhất định không?
Đầu tiên, điều quan trọng cần lưu ý là hai cái này rất khác nhau ở chỗ gc
không xóa any mà bạn vẫn đang sử dụng – nó chỉ giải phóng bộ nhớ cho những cái mà bạn không còn quyền truy cập (dù đã bị xóa bằng cách sử dụng rm()
hoặc, giả sử, được tạo trong một hàm đã được trả về). Chạy gc()
sẽ không bao giờ khiến bạn mất biến.
Tuy nhiên, câu hỏi liệu bạn có nên gọi gc()
sau khi gọi rm()
hay không, là một câu hỏi hay. tài liệu cho gc ghi chú hữu ích:
Một cuộc gọi của gc gây ra một bộ sưu tập rác diễn ra. Điều này cũng sẽ diễn ra tự động mà không cần sự can thiệp của người dùng và mục đích chính của việc gọi gc là để báo cáo về việc sử dụng bộ nhớ.
Tuy nhiên, có thể hữu ích để gọi gc sau khi một đối tượng lớn đã bị xóa, vì điều này có thể Nhắc R để trả lại bộ nhớ cho hệ điều hành.
Vì vậy, câu trả lời là có thể tốt khi gọi gc()
(và ít nhất, không thể làm tổn thương), mặc dù có thể nó sẽ được kích hoạt bằng mọi cách (nếu không ngay lập tức, thì sẽ sớm thôi).
Cá nhân tôi muốn đưa gc()
vào các vòng để giải phóng một số RAM khi các vòng lặp bắt đầu lấp đầy không gian có sẵn. Cái gì đó như
for(i in 1:1000){
res[[i]] = some operation
gc()
}
Nhận xét của ThankGoat về hình phạt gc, trong khi điều này là đúng, tất nhiên người ta có thể quyết định gọi gc mỗi lần lặp N trong một vòng lặp (trong đó N có thể được tham số hóa theo một số cách). Đối với các vòng lặp có số lần lặp lớn, nhưng việc sử dụng tài nguyên trong một lần lặp đã cho là khiêm tốn hơn, có thể không cần phải thực hiện mỗi lần lặp lại để đạt được hiệu suất mong muốn.
Tất nhiên, nếu bạn lặp đi lặp lại với số lần lặp sử dụng rất cao, thì đó là một câu chuyện khác, nhưng ở giai đoạn đó, có thể trường hợp mã chỉ cần được vector hóa và/hoặc thậm chí có thể được viết bằng ngôn ngữ khác .