Tôi đang xử lý một số tập dữ liệu lớn và đang làm những gì tôi có thể để ở trong giới hạn bộ nhớ của R. Một câu hỏi xuất hiện liên quan đến việc ghi đè các đối tượng R. Tôi có một lớn data.table
(hoặc bất kỳ đối tượng R), và nó phải được sao chép vào tmp
nhiều lần. Câu hỏi đặt ra là: nó có tạo nên sự khác biệt nào nếu tôi xóa tmp
trước khi ghi đè lên nó? Trong mã:Bộ nhớ được quản lý như thế nào khi ghi đè các đối tượng R?
for (1:lots_of_times) {
v_l_d_t_tmp <- copy(very_large_data_table) # Necessary copy of 7GB data
# table on 16GB machine. I can
# afford 2 but not 3 copies.
### do stuff to v_l_d_t_tmp and output
rm (v_l_d_t_tmp) # The question is whether this rm keeps max memory
# usage lower, or if it is equivalent to what an
# overwrite will automatically do on the next iteration.
}
Giả sử bản là cần thiết (Nếu tôi đạt được một điểm mà tôi cần phải đọc very_large_data_table
từ đĩa ở mỗi vòng lặp, tôi sẽ làm điều đó, nhưng câu hỏi đứng: nó sẽ làm cho bất kỳ sự khác biệt về tối đa sử dụng bộ nhớ nếu tôi xóa một cách rõ ràng v_l_d_t_tmp
trước khi tải lại vào nó?).
Hoặc, để dạy cho người đàn ông câu cá, tôi có thể gõ gì (trong R, chúng ta không thể vào được ps
) để tự mình trả lời?
Hoàn toàn OK nếu câu trả lời hóa ra là: "Tin tưởng thu gom rác thải".
Không phải chuyên gia, nhưng nó không tạo nên sự khác biệt. Trong cả hai trường hợp, vị trí bộ nhớ ban đầu không còn được chỉ định bởi một biểu tượng, vì vậy đủ điều kiện để thu thập rác (vui lòng được các chuyên gia sửa chữa). Một điều cần xem xét là liệu 'data.table' của bạn có thực sự cần được sao chép hay không. Nó được thiết kế để được sửa đổi bằng cách tham chiếu, do đó bạn không phải làm điều đó. – BrodieG
Khi @BrodieG cho biết sử dụng 'rm' cho' R' rằng bạn không còn cần phải truy cập 'v_l_d_t_tmp' và bộ nhớ bị chiếm bởi bảng này sẽ đủ điều kiện để thu thập rác. Tuy nhiên việc thu gom rác thải không diễn ra khi bạn gọi 'rm', nhưng" tự động ", khi cần. Điều này không phải lúc nào cũng hoạt động tốt, vì vậy bạn có thể ép buộc thu gom rác bằng cách gọi 'gc()' ngay sau khi bạn gọi 'rm (...)'. Điều này có thể làm cho vòng lặp của bạn hoạt động. Tuy nhiên trong kinh nghiệm của tôi, bạn thực sự cần phải khởi động lại R cho bộ nhớ được xóa sạch (có nghĩa là đọc trong đầu vào của bạn cho mỗi lần lặp lại, có lẽ khá chậm). – konvas
Từ kinh nghiệm của riêng tôi - người thu gom rác tin cậy. Chúng tôi đã phân tích cú pháp dữ liệu di truyền và chúng tôi đã ghi đè tất cả các khung dữ liệu bằng các dữ liệu mới, nhưng tôi không có nền tảng lý thuyết hỗ trợ ... –