2013-04-05 28 views
11

Tôi có bộ nhớ 6 GB trong máy tính của tôi (Windows 7 Pro 64 bit) và tại R, tôi nhận đượcquản lý bộ nhớ hiệu quả trong R

> memory.limit() 
6141 

Tất nhiên, khi giao dịch với dữ liệu lớn, lỗi cấp phát bộ nhớ xảy ra. Vì vậy, để làm cho R để sử dụng bộ nhớ ảo, tôi sử dụng

> memory.limit(50000) 

Bây giờ, khi chạy kịch bản của tôi, tôi không có lỗi cấp phát bộ nhớ nữa, nhưng heo R tất cả các bộ nhớ trong máy tính của tôi vì vậy tôi có thể không sử dụng máy cho đến khi tập lệnh hoàn tất. Tôi tự hỏi nếu có một cách tốt hơn để làm cho R quản lý bộ nhớ của máy. Tôi nghĩ rằng một cái gì đó nó có thể làm là sử dụng bộ nhớ ảo nếu nó được sử dụng bộ nhớ vật lý nhiều hơn người dùng chỉ định. Có lựa chọn nào như thế không?

Trả lời

9

Nhìn vào ff và các gói bigmemory. Điều này sử dụng các hàm biết về các đối tượng R để giữ chúng trên đĩa thay vì cho phép hệ điều hành (mà chỉ biết về các khối bộ nhớ, nhưng không phải là những gì chúng đại diện).

5

R không quản lý bộ nhớ của máy. Đó là trách nhiệm của hệ điều hành. Lý do duy nhất memory.sizememory.limit tồn tại trên Windows là vì (từ help("Memory-limits")):

Under Windows, R imposes limits on the total memory allocation 
available to a single session as the OS provides no way to do so: 
see 'memory.size' and 'memory.limit'. 

R đối tượng cũng phải chiếm không gian tiếp giáp trong RAM, vì vậy bạn có thể chạy vào các vấn đề cấp phát bộ nhớ chỉ với một vài đối tượng lớn. Bạn có thể cẩn thận hơn với số lượng/kích thước của các đối tượng bạn tạo và tránh sử dụng quá nhiều bộ nhớ.

+0

Hoặc đầu tư nhiều RAM hơn. – Roland

3

Đây không phải là giải pháp mà là đề xuất. Sử dụng các đối tượng hiệu quả bộ nhớ bất cứ khi nào có thể: ví dụ, sử dụng ma trận thay vì một data.frame.

Dưới đây là một ví dụ

m = matrix(rnorm(1000), 2, 2) 
d = as.data.frame(m) 
object.size(m) 
232 bytes 
object.size(d) 
808 bytes 
+3

Ví dụ này dường như chỉ làm nổi bật sự khác biệt phân bổ dữ liệu cố định rất nhỏ. Lấy ma trận là 'm = ma trận (rnorm (1000), 20000, 10)' và sự khác biệt về kích thước giữa các đối tượng trở nên không đáng kể. Trong thực tế, kiểm tra này cho một số 'data.frame' ngẫu nhiên tôi đã có trong không gian làm việc của tôi, phiên bản' ma trận' là lớn hơn 2 lần. Vì vậy, tôi không nghĩ rằng đề xuất này hữu ích cho vấn đề trong tầm tay. – eddi

+1

No. Tôi không đồng ý. Ma trận hiệu quả hơn data.frame. Đó là một trong những lý do tại sao, rất nhiều hàm R sẽ ép buộc để ma trận dữ liệu có trong các khung dữ liệu. Tôi đề cập rõ ràng rằng câu trả lời của tôi chỉ là một gợi ý thực hành tốt nhất nếu bạn muốn. Đối với bình luận thứ hai của bạn (ngẫu nhiên data.frame nhỏ hơn sau đó phiên bản ma trận) Tôi nghĩ rằng đó là Sai. – agstudy

+0

Đây là những gì tôi thấy cho một 'data.frame' cụ thể mà tôi có trong không gian làm việc của mình. 'object.size (as.data.frame (rec)): 11542192 bytes' và' object.size (as.matrix (rec)): 26516160 bytes'. – eddi

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