2009-07-23 30 views
24

Sau khi tạo các đối tượng lớn và chạy trên RAM, tôi sẽ cố gắng và xóa các đối tượng trong môi trường hiện tại của tôi sử dụngsử dụng bộ nhớ trong R

rm(list=ls()) 

Khi tôi kiểm tra việc sử dụng RAM của tôi, không có gì đã thay đổi. Ngay cả sau khi gọi gc() không có gì thay đổi. Tôi chỉ có thể bổ sung RAM bằng cách bỏ R.

Bất kỳ ai có lời khuyên để xử lý các đối tượng tốn nhiều bộ nhớ trong R?

Trả lời

19

Bộ nhớ cho các đối tượng đã xóa không được phát hành ngay lập tức. R sử dụng một kỹ thuật gọi là "thu gom rác" để lấy lại bộ nhớ cho các đối tượng đã xóa. Định kỳ, nó chu kỳ thông qua danh sách các đối tượng có thể truy cập (về cơ bản, những đối tượng có tên và chưa bị xóa và do đó có thể được người dùng truy cập) và "thẻ" chúng để lưu giữ. Bộ nhớ cho bất kỳ đối tượng không được gắn thẻ nào được trả về hệ điều hành sau khi quét bộ sưu tập rác.

Việc thu gom rác diễn ra tự động và bạn không có bất kỳ sự kiểm soát trực tiếp nào đối với quy trình này. Nhưng bạn có thể ép một lệnh quét bằng cách gọi lệnh gc() từ dòng lệnh.

Thậm chí sau đó, trên một số hệ điều hành, bộ sưu tập rác có thể không đòi lại bộ nhớ (như được báo cáo bởi hệ điều hành). Ví dụ, các phiên bản cũ hơn của Windows có thể tăng nhưng không làm giảm bộ nhớ của bộ sưu tập R. Garbage sẽ chỉ tạo không gian cho các đối tượng mới trong tương lai, nhưng sẽ không làm giảm việc sử dụng bộ nhớ của R.

3

Hiển thị của tôi là nhiều hình thức gc() được thử trước khi báo cáo R phân bổ bộ nhớ không thành công. Tôi không biết một giải pháp cho điều này hiện nay, khác hơn là khởi động lại R như bạn đề nghị. Dường như R không chống phân mảnh bộ nhớ.

8

Trên Windows, kỹ thuật bạn mô tả hoạt động cho tôi. Hãy thử ví dụ sau.

Mở Trình quản lý tác vụ Windows (CTRL + SHIFT + ESC).

Bắt đầu RGui. Sử dụng mem RGui.exe là 27 460K.

Loại

gcinfo(TRUE) 
x <- rnorm(1e8) 

RGui.exe sử dụng mem tại 811 100K là.

Nhập rm("x"). Sử dụng mem RGui.exe vẫn là 811 100K.

Nhập gc(). Sử dụng mem RGui.exe hiện là 28 332K.

Lưu ý rằng gc shoud được gọi tự động nếu bạn đã loại bỏ các đối tượng khỏi không gian làm việc của bạn, và sau đó bạn cố gắng cấp phát bộ nhớ nhiều hơn cho các biến mới.

+0

Đây là cách nó hoạt động về phía tôi. Tôi đang chạy R 2.8.1 trên Windows XP. – ars

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