Простой ответ на этот вопрос — «купить больше оперативной памяти», но я надеюсь получить более конструктивный ответ и узнать что-то в процессе.
Я использую Windows 7 64-бит с 8 ГБ оперативной памяти.
У меня есть несколько очень больших файлов .csv.gz (~ 450 МБ без сжатия) с точно такой же информацией заголовка, которую я читаю в R и выполняю некоторую обработку. Затем мне нужно объединить обработанные объекты R в один главный объект и записать обратно в .csv на диск.
Я делаю эту же операцию с несколькими наборами файлов. Например, у меня есть 5 папок, в каждой из которых по 6 файлов csv.gz. Мне нужно получить 5 мастер-файлов, по одному для каждой папки.
Мой код выглядит примерно так:
for( loop through folders ){
master.file = data.table()
for ( loop through files ) {
filename = list.files( ... )
file = as.data.table ( read.csv( gzfile( filename ), stringsAsFactors = F ))
gc()
...do some processing to file...
# append file to the running master.file
if ( nrow(master.file) == 0 ) {
master.file = file
} else {
master.file = rbindlist( list( master.file, file) )
}
rm( file, filename )
gc()
}
write.csv( master.file, unique master filename, row.names = FALSE )
rm( master.file )
gc()
}
Этот код не работает. Я получаю ошибку cannot allocate memory
до того, как он записывает окончательный CSV. Я наблюдал за монитором ресурсов во время выполнения этого кода и не понимаю, почему он использует 8 ГБ ОЗУ для выполнения этой обработки. Общий размер всех файлов составляет примерно 2,7 ГБ, поэтому я ожидал, что максимальный объем памяти, который R будет использовать, составит 2,7 ГБ. Но операция write.csv, по-видимому, использует тот же объем памяти, что и объект данных, который вы записываете, поэтому, если у вас есть объект размером 2,7 ГБ в памяти и вы пытаетесь записать его, вы будете использовать 5,6 ГБ памяти.
Эта кажущаяся реальность в сочетании с использованием цикла for
, в котором память не освобождается должным образом, кажется проблемой.
Я подозреваю, что мог бы использовать пакет sqldf
, как уже упоминалось of-memory">здесь и здесь но когда я установил оператор sqldf
равным переменной R, я получил те же ошибки нехватки памяти.
write.table(yourFirstDataTable, sep = ",", file = YourFile.csv)
для первого прочитанного и обработанного файла, а затемwrite.table(yourOtherDataTables, sep = ",", file = YourFile.csv, append = TRUE, col.names = FALSE)
? - person A5C1D2H2I1M1N2O1R2T1   schedule 21.12.2013