r - 如何将 2.8 GB gzipped (40 GB TSV) 文件批量读取到 R 中?

标签 r data.table readr r-bigmemory

我有一个包含 31 个 gzip 压缩 TSV 的目录(2.8 GB 压缩/40 GB 未压缩)。我想根据 1 列的值有条件地导入所有匹配的行,并合并到一个数据框中。

我已经阅读了这里的几个答案,但似乎没有一个有效 - 我怀疑它们不适合处理那么多数据。

简而言之,我怎样才能:

  1. 读取 3 GB 的 gzip 压缩文件
  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 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()调用,更不用说一列的过滤条件了。

最佳答案

这更多的是一个策略答案。

R 将所有数据加载到内存中进行处理,因此您会遇到正在查看的数据量的问题。

我建议你做的,也是我所做的,是使用 Apache Spark 进行数据处理,并使用 R 包 Sparklyr 与其连接。然后,您可以将数据加载到 Spark 中,在那里进行处理,然后将汇总的数据集检索回 R 中以进行进一步的可视化和分析。

您可以在 R Studio 实例中本地安装 Spark 并在那里执行很多操作。如果您需要进一步的计算能力,请考虑托管选项,例如 AWS。

阅读本文 https://spark.rstudio.com/

一个技术点是,有一个 sparklyr 函数 spark_read_text 它将直接将分隔文本文件读取到 Spark 实例中。这非常有用。

从那里您可以使用dplyr来操作您的数据。祝你好运!

关于r - 如何将 2.8 GB gzipped (40 GB TSV) 文件批量读取到 R 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52959745/

相关文章:

r - 如何使用 lapply 将值重新分配给 data.table 的现有列?

r - 根据现有列的子字符串在 R data.table 中创建列

sql - 在 R 脚本中传递字符串变量以在 SQL 语句中使用它

r - R 中矢量/矩阵形式的 ODE 求解系统(使用 deSolve?)

r - 如何使用 Plotly 摆脱默认工具提示?

r - readr()/read_csv中,如何导入所有列为字符的数据

r - dplyr : how to read a tsv file with headers while skipping some lines?

r - R 中的无监督学习?矩阵分类 - 什么是正确的包?

r - 如何计算R中分组数据行之间距离和时间差的所有可能组合?

r - 处理 CSV 文件中包含分号的字符变量