Подтвердить что ты не робот

Ограничение строки для data.table в R с использованием fread

Я хотел знать, существует ли ограничение на количество строк, которые могут быть прочитаны с помощью функции fread. Я работаю со столом с 4 миллиардами строк, 4 столбцами, около 40 ГБ. Похоже, что fread будет читать только первые ~ 840 миллионов строк. Он не дает никаких ошибок, но возвращает в запрос R, как будто он прочитал все данные!

Я понимаю, что fread не для "prod use" на данный момент, и хотел узнать, существует ли какой-либо временной интервал для реализации выпуска prod.

Причина, по которой я использую data.table, заключается в том, что для файлов таких размеров она чрезвычайно эффективна при обработке данных по сравнению с загрузкой файла в data.frame и т.д.

В настоящий момент я пытаюсь использовать еще две альтернативы -

1) Использование сканирования и перехода к таблице данных.

data.table(matrix(scan("file.csv",what="integer",sep=","),ncol=4))

Resulted in --
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
  too many items

2) Разбиение файла на несколько отдельных сегментов с ограничением ок. 500 миллионов строк, использующих Unix, и чтение их последовательно... затем циклическое чередование файлов последовательно в fread - немного громоздкое, но похоже, что это единственное работоспособное решение.

Я думаю, что может быть Rcpp-способ сделать это еще быстрее, но я не уверен, как он обычно реализуется.

Спасибо заранее.

4b9b3361

Ответ 1

Я смог выполнить это, используя обратную связь от другой публикации в Stackoverflow. Процесс был очень быстрым, и 40 ГБ данных были прочитаны примерно через 10 минут, используя итеративно. Foreach-dopar не работал, когда запускался сам по себе, чтобы читать файлы в новые data.tables последовательно из-за некоторых ограничений, которые также упоминаются на странице ниже.

Примечание. Список файлов (file_map) был подготовлен простым запуском -

file_map <- list.files(pattern="test.$")  # Replace pattern to suit your requirement

mclapply с большими объектами - сериализация слишком велика для хранения в необработанном векторе

Цитата -

collector = vector("list", length(file_map)) # more complex than normal for speed 

for(index in 1:length(file_map)) {
reduced_set <- mclapply(file_map[[index]], function(x) {
  on.exit(message(sprintf("Completed: %s", x)))
  message(sprintf("Started: '%s'", x))
  fread(x)             # <----- CHANGED THIS LINE to fread
}, mc.cores=10)
collector[[index]]= reduced_set

}

# Additional line (in place of rbind as in the URL above)

for (i in 1:length(collector)) { rbindlist(list(finalList,yourFunction(collector[[i]][[1]]))) }
# Replace yourFunction as needed, in my case it was an operation I performed on each segment and joined them with rbindlist at the end.

Моя функция включала цикл с использованием Foreach dopar, который выполнялся через несколько ядер на файл, как указано в file_map. Это позволило мне использовать допар, не сталкиваясь с "слишком большой ошибкой сериализации" при работе в объединенном файле.

Другое полезное сообщение - загрузка файлов параллельно, не работающая с foreach + data.table