Как пакетно прочитать 2,8 ГБ сжатых (40 ГБ TSV) файлов в R? - PullRequest
0 голосов
/ 24 октября 2018

У меня есть каталог с 31 сжатым TSV (2,8 ГБ сжатых / 40 ГБ несжатых).Я хотел бы условно импортировать все совпадающие строки на основе значения 1 столбца и объединить их в один фрейм данных.

Я прочитал несколько ответов здесь, но, похоже, ни один из них не работает - я подозреваю, что онине предназначен для обработки такого количества данных.

Короче говоря, как я могу:

  1. Читать 3 ГБ сжатых файлов
  2. Импортировать только те строки, столбец которых соответствует определенному значению
  3. Объединитьсопоставление строк в одном кадре данных.

Данные аккуратные, интересны только 4 столбца: дата, ip, тип (str), категория (str).

Первое, что я попробовал использовать read_tsv_chunked():

library(purrr)
library(IPtoCountry)
library(lubridate)
library(scales)
library(plotly)
library(tidyquant)
library(tidyverse)
library(R.utils)
library(data.table)

#Generate the path to all the files.
import_path <- "import/"
files <-  import_path %>% 
  str_c(dir(import_path))

#Define a function to filter data as it comes in.
call_back <- function(x, pos){
  unique(dplyr::filter(x, .data[["type"]] == "purchase"))
}

raw_data <- files %>%
  map(~ read_tsv_chunked(., DataFrameCallback$new(call_back),
      chunk_size = 5000)) %>%
  reduce(rbind) %>%
  as_tibble() # %>%

Этот первый подход работал с 9 ГБ несжатых данных, но не с 40 ГБ.

Второйподход с использованием fread() (те же загруженные пакеты):

 #Generate the path to all the files.
    import_path <- "import/"
    files <-  import_path %>% 
      str_c(dir(import_path))

 bind_rows(map(str_c("gunzip - c", files), fread))

Это выглядело так, как будто оно начало работать, но затем заблокировалось.Я не мог понять, как передать аргумент select = c(colnames) в fread() внутри вызовов map() / str_c(), не говоря уже о критериях фильтрации для одного столбца.

Ответы [ 2 ]

0 голосов
/ 13 апреля 2019

Во-первых, если используется базовая read.table , вам не нужно ничего делать gunzip , поскольку он использует Zlib для непосредственного их чтения. read.table также работает намного быстрее, если указан параметр colClasses .

Возможно, вам понадобится написать собственный код R , чтобы создать расплавленный кадр данных непосредственно из каждого из 31 TSV, а затем накопить их с помощью rbind ing.

Тем не менее это поможет иметь машину с большим количеством быстрой виртуальной памяти.Я часто работаю с наборами данных в этом порядке, и иногда я нахожу систему Ubuntu, требующую памяти, даже если она имеет 32 ядра.У меня есть альтернативная система, в которой я убедил ОС в том, что SSD занимает больше памяти, давая мне эффективную 64 ГБ оперативной памяти.Я считаю это очень полезным для некоторых из этих проблем.Это Windows, поэтому мне нужно установить memory.limit (size = ...) соответственно.

Обратите внимание, что после считывания TSV с использованием read.table он довольно сжат, приближаясь к тому, что обеспечивает gzip .Вам может не понадобиться большая система, если вы делаете это таким образом.

Если это займет много времени (я сомневаюсь в этом), обязательно проверьте контрольную точку и save.image в промежутках между ними.

0 голосов
/ 24 октября 2018

Это скорее стратегический ответ.

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

Я предлагаю вам сделать то, что я делаю, - это использовать Apache Spark для обработки данных и использовать R-пакет sparklyr для взаимодействия с ним.Затем вы можете загрузить свои данные в Spark, обработать их там, а затем извлечь сводный набор данных обратно в R для дальнейшей визуализации и анализа.

Вы можете установить Spark локально в своем экземпляре R Studio и многое сделать там.Если вам нужны дополнительные вычислительные мощности, обратите внимание на вариант размещения, такой как AWS.

Прочтите это https://spark.rstudio.com/

Один технический момент, есть функция sparklyr spark_read_text, которая будет считывать текстовые файлы с разделителями непосредственно в экземпляр Spark.Это очень полезно.

Оттуда вы можете использовать dplyr для управления вашими данными.Удачи!

...