2015-05-12 2 views
0

Я зацикливание над CSV файлов и ввод данных в «основной» dataframeРазмер выпущен в R

Я на окнах и с использованием 32 бит R.

for(i in 1:length(files)) 
{ 
    print(files[i]) 
    f <- read.csv(files[i],header=TRUE, stringsAsFactors=FALSE) 
    if(i ==1) 
    { 
    main= f 
    }else 
    { 
    main = rbind(main, f) 
    } 
    print(dim(main)) 
    print(memory.size(max = FALSE)) 
} 

Я получаю эту ошибку:

Error: cannot allocate vector of size 64.0 Mb 

последняя печать из тусклых основного и размера является

[1] 4335123  49 
[1] 2139.9 

, так что в основном есть 4,3 миллиона строк, и я думаю, что размер означает 2139 мб в R.

Любая идея, как я могу обойти эту ошибку? Главному нужно удерживать около 7 миллионов строк.

спасибо.

+0

Скамья идей: какая у вас ОС Unix/Win? Вы можете попробовать fread из пакета data.table? –

+0

окна и 32 бит R – user3022875

+0

[Этот ответ SO] (http://stackoverflow.com/questions/10917532/r-memory-allocation-error-cannot-allocate-vector-of-size-75-1-mb) может быть полезным. – eipi10

ответ

0

Это будет большая загрузка данных для сеанса R (и это может быть невозможно в 32-разрядной ОС). R требует непрерывного пространства памяти для любого нового объекта. Завершите работу R. выйдите из всех других программ и уменьшите количество программ, которые будут загружены при перезагрузке Windows. Затем загрузите только R и повторите попытку с новым сеансом.

Если это не удается, вам нужно будет подумать об ограничении количества строк при загрузке файлов. Посмотрите на `? Read.csv 'для параметра, который устанавливает верхний предел количества строк.

7 миллионов строк с 49 столбцами собираются создать объект размером не менее 5 * 7000000 * 49 байтов и это только в том случае, если каждый столбец состоял из одиночных значений символа.Если они были числовыми столбцами, тогда требование к пространству было бы удвоено. Обычная конфигурация 32-разрядной Windows допускает только 2,5 ГБ, что теоретически удерживало бы данные минимального размера, но даже тогда вы, вероятно, не в состоянии сделать что-нибудь полезное с ним.

вероятно, самый дешевый шаг будет арендовать некоторое облако пространства с экземпляром R и памятей достаточных для выполнения этой задачи, скажем, от 8 до 16 Гб.

+0

Вы также можете включить 'gc()' («сбор мусора») в конце каждой итерации вашего цикла, что приведет к тому, что R освободит любую память, которую он выделил, но больше не нуждается. – eipi10

+1

Это, вероятно, не повредит. Сбор мусора должен происходить автоматически. –

+0

Это так, но когда вам нужно быть уверенным, что это происходит сразу, лучше называть это явно. Например, в файле справки говорится: «... может быть полезно вызвать gc после удаления большого объекта, поскольку это может побудить R вернуть память в операционную систему». – eipi10

0

Вы применили подход «copy and append» с main = rbind(main, f), который делает n * (n - 1)/2 копии данных и использует память очень неэффективно. Вместо этого попробуйте «предварительное выделение и заполнить»

result = vector("list", length(files)) 
for (i in seq_along(files)) { 
    ## ... 
    result[[i]] = f 
} 

с последующим окончательным rbind():

result = do.call("rbind", result) 

Это сделает только две копии данных, хотя вы, возможно, еще нажать на память.

Смежные вопросы