我有一个包含 31 个 gzip 压缩 TSV(2.8 GB 压缩/40 GB 未压缩)的目录。我想根据 1 列的值有条件地导入所有匹配的行,并组合成一个数据框。
我在这里阅读了几个答案,但似乎没有一个有效 - 我怀疑它们不适合处理那么多数据。
简而言之,我该如何:
- 读取 3 GB 的 gzip 文件
- 仅导入其列与某个值匹配的行
- 将匹配的行合并到一个数据框中。
数据很整齐,只有 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 GB 的未压缩数据,但不适用于 40 GB。
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()