read.table в кусках - сообщение об ошибке

У меня есть большой файл с 6-миллионными строками, и я пытаюсь прочитать данные по частям для обработки, поэтому я не превышаю лимит ОЗУ. Вот мой код (обратите внимание, temp.csv — это просто фиктивный файл с 41 записью):

infile <- file("data/temp.csv", open="r")

headers <- as.character(read.table(infile, header = FALSE, nrows=1, sep=",", stringsAsFactors=FALSE))

while(length(temp <-read.table(infile, header = FALSE, nrows=10, sep=",", stringsAsFactors=FALSE)) > 0){
  temp <- data.table(temp)
  setnames(temp, colnames(temp), headers)
  setkey(temp, Id)
  print(temp[1, Tags])
}

print("hi")

close(infile)

Все идет гладко до последней итерации. Я получаю это сообщение об ошибке:

Error in read.table(infile, header = FALSE, nrows = 10, sep = ",", stringsAsFactors = FALSE) : 
  no lines available in input
In addition: Warning message:
In read.table(infile, header = FALSE, nrows = 10, sep = ",", stringsAsFactors = FALSE) :
  incomplete final line found by readTableHeader on 'data/temp.csv'

Предположительно, это связано с тем, что последняя итерация имеет только 1 строку записей, а read.table ожидает 10?

Все данные на самом деле читаются нормально. Удивительно, но даже в последней итерации temp по-прежнему преобразуется в data.table. Но print("hi") и все, что после него, никогда не выполняется. Есть ли что-то, что я могу сделать, чтобы обойти это?

Спасибо.


person mchangun    schedule 18.10.2013    source источник
comment
ЧТО произойдет, если вы просто запустите fread("data/temp.csv", sep = ',')?   -  person mnel    schedule 18.10.2013
comment
@mnel Даже с read.table я могу загрузить весь набор данных. Проблема в том, что на этапе обработки у меня возникают проблемы с ОЗУ, поэтому мне нужно разделить его.   -  person mchangun    schedule 18.10.2013


Ответы (1)


Ах понял!

repeat{
  temp <-read.table(infile, header = FALSE, nrows=10, sep=",", stringsAsFactors=FALSE)

  temp <- data.table(temp)
  setnames(temp, colnames(temp), headers)
  setkey(temp, Id)
  print(temp[1, Tags])

  if (nrow(temp) < 10) break
}

print("hi")

Это по-прежнему выдает предупреждающее сообщение, но ошибок больше нет:

Warning message:
In read.table(infile, header = FALSE, nrows = 10, sep = ",", stringsAsFactors = FALSE) :
  incomplete final line found by readTableHeader on 'data/temp.csv'
person mchangun    schedule 18.10.2013