2015-05-30 23 views
9

Tôi có một biến có kích thước tăng từ vài MB đến 3 GB trong một vòng lặp. và tôi bị lỗi bộ nhớ. Tôi đã thử một số giải pháp như tăng số lượng bộ nhớ R có thể sử dụng, cũng bằng cách sử dụng rm() và gc(). Tôi đã nghĩ nếu nó có thể giải quyết nếu tôi chỉ định 3GB cho biến này lúc đầu. Bây giờ:Cách chỉ định kích thước bộ nhớ cố định cho một biến trong R

  1. Có thể trong R?

  2. Nếu có, nó sẽ cải thiện tốc độ?

  3. Có thể xảy ra rằng giải quyết ra lỗi bộ nhớ

Tôi có một 64-bit Windows 7 OS. mã của tôi là hơn nghìn dòng. nhưng dòng chính là

1.getting dữ liệu từ một tập tin truy cập bởi các chức năng odbcConnectAccess2007 và sqlFetch và đưa bảng trong một temp biến

2.merging Biến Thạc sĩ với nhiệt độ biến

+5

Bạn có thể cung cấp ví dụ (mã) về sự cố của mình không. * "Tăng kích thước" * thường là vấn đề. Xem thêm vòng thứ hai của [The R-Inferno] (http://www.burns-stat.com/pages/Tutor/R_inferno.pdf). – sgibb

+3

hãy xem xét sử dụng gói 'ETLUtils' và' ff'/'ffbase' /' ffbase2', cho phép bạn lấy dữ liệu từ kết nối odbc và lưu trữ 'data.frame' không có trong RAM nhưng trên HDD. – inscaven

Trả lời

1

Nếu không nhìn thấy mã cụ thể , thật khó để biết điều gì sẽ giúp ích cho bạn. Nhưng nếu bạn đang gọi rbind/cbind/merge trong vòng lặp for, điều đó cực kỳ không hiệu quả. Những gì bạn có thể làm là ném mọi thứ vào một danh sách và sau đó sử dụng do.call ở cuối. So sánh:

data_list <- list(); 
length(data_list) <- 2000 

for(i in 1:2000) { 
    data_list[[i]] <- data.frame(matrix(runif(11*10), ncol=11, nrow=10)) 
} 


sequentialRbind<-function() { 
    res <- data_list[[1]] 
    for(i in 2:length(data_list)) { 
     res <- rbind(res, data_list[[i]]) 
    } 
    return(res) 
} 

> system.time(res1 <- do.call(rbind,data_list)) 
    user system elapsed 
    0.78 0.00 0.78 
> 
> system.time(res2 <- Reduce(rbind,data_list)) 
    user system elapsed 
    8.24 0.00 8.27 
> 
> system.time(res3 <- sequentialRbind()) 
    user system elapsed 
    8.25 0.00 8.27 
Các vấn đề liên quan