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