2015-05-30 2 views
9

У меня есть переменная, которая растет в размере от нескольких МБ до 3 ГБ в цикле. и я получаю ошибку памяти. Я пробовал некоторые решения, такие как увеличение объема памяти R, а также использование rm() и gc(). Я подумал, если это возможно, если я сначала назначу 3 ГБ этой переменной. В настоящее время:Как назначить размер фиксированной памяти переменной в R

  1. Возможно ли в R?

  2. Если да, улучшит ли скорость?

  3. ли вероятность того, что решить из памяти ошибки

У меня есть 64-разрядной ОС Windows 7. мой код более тысячи строк. но основные линии

1.getting данные из файла доступ с помощью функций odbcConnectAccess2007 и SQLFetch и положить таблицу в переменной температуре

2.merging мастер переменного с переменным темпом

+5

Не могли бы вы предоставить (код) пример вашей проблемы. * «Рост в размерах» * часто является проблемой. См. Также второй круг [The R-Inferno] (http://www.burns-stat.com/pages/Tutor/R_inferno.pdf). – sgibb

+3

взгляните на использование пакетов 'ETLUtils' и' ff'/'ffbase' /' ffbase2', которые позволят вам получать данные из соединения odbc и хранить ваш 'data.frame' не в ОЗУ, а на HDD. – inscaven

ответ

1

не видя конкретный код , трудно понять, что поможет. Но если вы вызываете rbind/cbind/merge в цикле for, это крайне неэффективно. Что вы можете сделать, это бросить все в список, а затем использовать do.call в конце. Сравнить:

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 
Смежные вопросы