2011-12-21 40 views
6

Tôi đã nhấn vào một bức tường cố gắng hợp nhất một tệp lớn và một tệp nhỏ hơn. Tôi có readmany các bài đăng khác về quản lý bộ nhớ trong R và chưa thể tìm phương thức khắc phục không cực đoan (đi 64bit, tải lên cụm, v.v.). Tôi đã thử một chút với gói bigmemory, nhưng không thể tìm ra giải pháp. Tôi nghĩ tôi sẽ cố gắng ở đây trước khi tôi giơ tay lên trong sự thất vọng.Hợp nhất lớn/Quản lý bộ nhớ

Mã Tôi đang chạy cũng giống như dưới đây:

#rm(list=ls()) 
localtempdir<- "F:/Temp/" 
memory.limit(size=4095) 
[1] 4095 
    memory.size(max=TRUE) 
[1] 487.56 
gc() 
     used (Mb) gc trigger (Mb) max used (Mb) 
Ncells 170485 4.6  350000 9.4 350000 9.4 
Vcells 102975 0.8 52633376 401.6 62529185 477.1 

client_daily<-read.csv(paste(localtempdir,"client_daily.csv",sep=""),header=TRUE) 
object.size(client_daily) 
>130MB 

sbp_demos<-read.csv(paste(localtempdir,"sbp_demos",sep="")) 
object.size(demos) 
>0.16MB 
client_daily<-merge(client_daily,sbp_demos,by.x="OBID",by.y="OBID",all.x=TRUE) 
Error: cannot allocate vector of size 5.0 MB 

Tôi đoán tôi đang hỏi là có cách nào thông minh xung quanh này mà không liên quan đến việc mua phần cứng mới?

  1. Tôi cần có thể merge để tạo đối tượng lớn hơn.
  2. Sau đó tôi sẽ cần phải thực hiện các phép hồi quy v.v ... với đối tượng lớn hơn đó.

Tôi có nên bỏ cuộc không? Nên bigmemory có thể giúp giải quyết điều này?

Bất kỳ hướng dẫn nào được đánh giá cao.

chi tiết: R phiên bản 2.13.1 (2011/07/08) Hệ điều hành: i386-pc-mingw32/i386 (32-bit) Intel 2 Duo Core @ 2.33GHz, 3.48GB RAM

+4

Bạn đã xem gói 'data.table' chưa? Đó là * nhanh chóng * cho việc hợp nhất lớn, và tình cờ có thể có nhiều bộ nhớ hiệu quả hơn để khởi động? – Chase

+0

Điều này có thể sẽ không giải quyết được vấn đề của bạn, nhưng đây là điều bạn có thể thử. Nếu có bất kỳ cột nào trong bộ dữ liệu mà bạn không cần: hãy xóa chúng sau khi đọc dữ liệu, thực hiện gc() rồi thử hợp nhất lại. Một ý tưởng khác là chuyển đổi dữ liệu của bạn thành ma trận nếu có thể, vì chúng có xu hướng sử dụng ít bộ nhớ hơn. – Rguy

Trả lời

8

Như Chase đã đề cập, bạn có thể thử data.table hoặc có lẽ sqldf.

Đối với cả hai, bạn có thể sẽ nhận được nhiều nước hơn nếu bạn đặt chỉ mục một cách thích hợp.

Với data.table bạn sẽ:

dt1 <- data.table(sbp_demos, key='OBID') 
dt2 <- data.table(client_daily, key='OBID') 

## Do an INNER JOIN-like operation, where non-matching rows are removed 
mi <- dt1[dt2, nomatch=0] 

## Do a RIGHT JOIN(?)-like operation ... all rows in dt2 will be returned. 
## If there is no matching row in dt1, the values in the dt1 columns for 
## the merged row will be NA 
mr <- dt1[dt2] 

Nếu bạn đi theo sqldf tuyến đường, look at example 4i on its website ... một lần nữa, hãy chắc chắn rằng bạn sử dụng các chỉ số chính xác.