Прочитать огромный CSV-файл, используя `read.csv`, используя стратегию« разделяй и властвуй »? - PullRequest
0 голосов
/ 15 апреля 2019

Я должен прочитать большой CSV-файл (5,4 ГБ с 7 м строк и 205 столбцов) в R. Я успешно прочитал его, используя data.table::fread(). Но я хочу знать, возможно ли прочитать его, используя базовый read.csv()?

Я пытался использовать только грубую силу, но моя 16 ГБ ОЗУ не может этого удержать. Затем я попытался использовать стратегию «разделяй и властвуй» (чанкинг), как показано ниже, но она все еще не работала. Как мне это сделать?

dt1 <- read.csv('./ss13hus.csv', header = FALSE, nrows = 721900, skip =1)
print(paste(1, 'th chunk completed'))
system.time(
  for (i in (1:9)){
    tmp = read.csv('./ss13hus.csv', header = FALSE, nrows = 721900, skip = i * 721900 + 1)
    dt1 <- rbind(dt1, tmp)
    print(paste(i + 1, 'th chunk completed'))
  }
)

Кроме того, я хочу знать, как работает fread(), который может считывать все данные одновременно и очень эффективно, независимо от времени или памяти?

1 Ответ

4 голосов
/ 15 апреля 2019

Ваша проблема не fread(), это раздувание памяти, вызванное не определением colClasses для всех ваших (205) столбцов .Но имейте в виду, что попытка считывания всех 5,4 ГБ в 16 ГБ ОЗУ действительно требует больших усилий, вы почти наверняка не сможете хранить весь этот набор данных в памяти;и даже если бы вы могли, вы стираете память всякий раз, когда пытаетесь ее обработать.Таким образом, ваш подход не сработает, вы серьезно должны решить, какое подмножество вы можете обработать - какие поля вам абсолютно необходимы для начала :

  • Определите colClasses для ваших 205 столбцов : «целое число» для целочисленных столбцов, «числовое» для двойных столбцов, «логическое» для логических столбцов, «фактор» для столбцов фактора.В противном случае вещи хранятся очень неэффективно (например, миллионы строк очень расточительны), и результат может быть в 5-100 раз больше, чем необработанный файл.

  • Если вы не можете уместить все7 м строк x 205 столбцов (что вы почти наверняка не сможете), затем вам нужно будет агрессивно уменьшить объем памяти, выполнив некоторые или все из следующих действий :

    • читать и обрабатывать чанки (из строк) (использовать skip, nrows аргументы и искать в SO вопросы по хреду в чанках)
    • отфильтровывать все ненужные строки (например,Вы можете выполнить некоторую грубую обработку, чтобы сформировать индекс строки нужных вам подмножеств и импортировать этот намного меньший набор позже)
    • отбросить все ненужные столбцы (используйте freadselect / drop аргументы (укажите векторы имен столбцов для сохранения или удаления).
  • Убедитесь, что option stringsAsFactors=FALSE, этообщеизвестно плохое значение по умолчанию в R, которое не приводит к концу горя памяти.

  • Date / datetimВ настоящее время поля читаются как символы (что является плохой новостью для использования памяти, миллионы уникальных строк).Либо полностью отбросьте столбцы даты для начала, либо прочитайте данные порциями и преобразуйте их с помощью пакета fasttime или стандартных базовых функций.
  • Посмотрите на аргументы для обработки NA.Возможно, вы захотите отбросить столбцы с множеством NA или грязными необработанными строковыми полями.

Пожалуйста, смотрите ?fread и data.table doc для синтаксиса длявыше.Если вы столкнулись с конкретной ошибкой, опубликуйте фрагмент, скажем, 2 строки данных (head(data)), свой код и ошибку.

...