2013-01-16 34 views
7

Tôi đang chạy một số mô phỏng trên máy có bộ nhớ 16GB. Trước tiên, tôi đã gặp một số lỗi:Vấn đề bộ nhớ R với bộ nhớ.limit()

Error: cannot allocate vector of size 6000.1 Mb (the number might be not accurate) 

Sau đó, tôi đã cố gắng để cấp phát bộ nhớ hơn cho R bằng cách sử dụng:

memory.limit(1E10) 

Lý do của việc lựa chọn một số lượng lớn như vậy là vì memory.limit không thể cho phép tôi lựa chọn một số ít hơn hệ thống của tôi tổng bộ nhớ

In memory.size(size) : cannot decrease memory limit: ignored 

Sau khi thực hiện điều này, tôi có thể hoàn thành mô phỏng của tôi, nhưng R mất khoảng bộ nhớ 15GB, mà dừng lại của tôi từ làm bất kỳ bài Analy sis.

Tôi đã sử dụng object.size() để ước tính tổng bộ nhớ được sử dụng của tất cả biến được tạo, chỉ mất khoảng 10GB. Tôi không thể biết được R lấy phần còn lại của bộ nhớ ở đâu. Vì vậy, câu hỏi của tôi là làm thế nào để phân bổ hợp lý bộ nhớ cho R mà không cần nổ máy của tôi? Cảm ơn!

+2

bạn có chắc chắn đã xem xét tất cả các biến hiện có? Liệu 'ls (all = TRUE)' chỉ liệt kê những cái bạn đã tạo ra? Lưu ý rằng ngay cả khi một đối tượng bị xóa, bộ nhớ được sử dụng để lưu trữ đối tượng đó không phải là miễn phí cho đến khi bộ thu gom rác được gọi. R thực hiện việc này định kỳ, nhưng bạn có thể bắt buộc thu thập với 'gc()'. –

+0

Tôi chưa kiểm tra mức sử dụng bộ nhớ cho tất cả bộ nhớ của mình. Nhưng tôi đã sử dụng gc() trong mô phỏng của tôi sau mỗi lần lặp ... –

+2

Nói chung, bạn cần khoảng 3 lần số lượng bộ nhớ mà đối tượng của bạn chiếm. Điều này là do sao chép các đối tượng. –

Trả lời

2

R được diễn giải để WYSINAWYG (những gì bạn thấy không phải lúc nào cũng là những gì bạn nhận được). Như được đề cập trong các ý kiến ​​bạn cần thêm bộ nhớ được yêu cầu bởi việc lưu trữ các đối tượng của bạn do sao chép các đối tượng đã nói. Ngoài ra, có thể ngoài việc không hiệu quả, các vòng lặp for lồng nhau là một ý tưởng tồi bởi vì gc sẽ không chạy trong vòng lặp trong cùng. Nếu bạn có bất kỳ điều nào trong số này, tôi khuyên bạn nên xóa chúng bằng các phương pháp được vector hóa hoặc bạn gọi theo cách thủ công gc trong vòng lặp của bạn để buộc thu gom rác, nhưng được cảnh báo điều này sẽ làm chậm mọi thứ xuống một phần các đối tượng có thể được minh họa bằng ví dụ sau. Mã này phát triển một đối tượng data.frame. Xem sử dụng bộ nhớ trước, sau và kích thước đối tượng kết quả. Có rất nhiều rác được phép tích lũy trước khi gc được gọi. Tôi nghĩ rằng bộ sưu tập rác là vấn đề trên Windows so với các hệ thống * nix. Tôi không thể sao chép ví dụ ở dưới cùng trên Mac OS X, nhưng tôi có thể lặp lại trên Windows. Vòng lặp và giải thích thêm có thể được tìm thấy trong The R Inferno trang 13 ...

# Current memory usage in Mb 
memory.size() 
# [1] 130.61 
n = 1000 

# Run loop overwriting current objects 
my.df <- data.frame(a=character(0), b=numeric(0)) 
for(i in 1:n) { 
this.N <- rpois(1, 10) 
my.df <- rbind(my.df, data.frame(a=sample(letters, 
this.N, replace=TRUE), b=runif(this.N))) 
} 
# Current memory usage afterwards (in Mb) 
memory.size() 
# [1] 136.34 

# BUT... Size of my.df 
print(object.size(my.df) , units = "Mb") 
0.1 Mb 
Các vấn đề liên quan