2012-07-19 28 views
17

Tôi đang cố gắng hợp nhất hai khung dữ liệu: một khung có 908450 quan sát 33 biến, và biến còn lại có 908450 quan sát 2 biến.Vượt quá giới hạn bộ nhớ trong R (thậm chí với RAM 24GB)

dataframe2 <-merge(dataframe1, dataframe2, by="id") 

Tôi đã xóa tất cả dataframes khác từ bộ nhớ làm việc, và đặt lại giới hạn bộ nhớ của tôi (cho một thương hiệu máy tính để bàn mới với 24 GB RAM) sử dụng mã:

memory.limit(24576) 

Nhưng, tôi m vẫn gặp lỗi Cannot allocate vector of size 173.Mb.

Bất kỳ suy nghĩ nào về cách giải quyết vấn đề này?

+4

gói 'data.table' có thể bộ nhớ hiệu quả hơn và nhanh hơn nhiều hơn 'data.frames' vì nó làm cho ít bản sao của dữ liệu nhiều. – Chase

+2

Bạn đang thực sự sử dụng 24 Gb, và liên quan, là hệ điều hành 64 bit của bạn? –

+0

Hệ điều hành phải có khả năng phân bổ số lượng yêu cầu bộ nhớ tiếp giáp với R. Vì vậy, bạn có thể bị giới hạn bởi các ứng dụng khác mà bạn đang chạy. – James

Trả lời

21

Để theo dõi ý kiến ​​của tôi, sử dụng data.table. Tôi kết hợp một ví dụ nhanh phù hợp với dữ liệu của bạn để minh họa:

library(data.table) 

dt1 <- data.table(id = 1:908450, matrix(rnorm(908450*32), ncol = 32)) 
dt2 <- data.table(id = 1:908450, rnorm(908450)) 
#set keys 
setkey(dt1, id) 
setkey(dt2, id) 
#check dims 
> dim(dt1) 
[1] 908450  33 
> dim(dt2) 
[1] 908450  2 
#merge together and check system time: 
> system.time(dt3 <- dt1[dt2]) 
    user system elapsed 
    0.43 0.03 0.47 

Vì vậy, phải mất chưa đầy 1/2 giây để hợp nhất với nhau. Tôi chụp ảnh trước và sau khi xem bộ nhớ của mình. Trước khi hợp nhất, tôi đã sử dụng 3,4 hợp đồng biểu diễn ram. Khi tôi sáp nhập với nhau, nó đã tăng lên 3,7 và giảm dần. Tôi nghĩ rằng bạn sẽ khó ép để tìm một cái gì đó nhiều bộ nhớ hơn hoặc thời gian hiệu quả hơn thế.

Trước: enter image description here

Sau: enter image description here

+0

Xin chào - Câu hỏi nhanh. Tôi đã thay đổi cả hai dataframes của tôi thành các bảng dữ liệu bằng cách sử dụng 'dat1_table <-data.table (data1)' và 'dat2_table <-data.table (data2)'. Nhưng sau đó, khi tôi cố gắng setkey, tôi nhận được lỗi 'Cột 2 là chiều dài 9 mà khác với chiều dài của cột 1'. Tuy nhiên, số hàng xuất hiện giống nhau bằng cách sử dụng 'dim()'. – roody

+0

@roody - thật kỳ lạ. Tôi chỉ thử nghiệm bằng cách sử dụng các ví dụ trên bằng cách làm cho chúng data.frames đầu tiên, sau đó chuyển đổi sang data.tables bằng cách sử dụng phương pháp của bạn. Tôi không thể tái tạo lỗi. Bạn có chắc chắn rằng 'dữ liệu1' và' dữ liệu2' trong thực tế là data.frames? Bạn có thể kiểm tra với 'class()', hoặc 'str()' hoặc 'is.data.frame()'. Bạn cũng có thể thử thiết lập khóa khi bạn tạo data.table trong một lệnh, nghĩa là 'dt <- data.table (yourDF, key =" yourKey ")' – Chase

+0

Hi Chase - Dường như biến ngày tháng trong một trong các bộ dữ liệu đã nhét mọi thứ lên. Và tất cả đều hiệu quả! CẢM ƠN BẠN RẤT NHIỀU! – roody

2

Theo như tôi có thể nghĩ đến có ba giải pháp:

  • Sử dụng datatables
  • Sử dụng bộ nhớ swap (có thể điều chỉnh được trên máy * nix)
  • Sử dụng mẫu
Các vấn đề liên quan