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

如何将2.8GB Gzip(40GB TSV)文件批量读取到R中?,r,data.table,readr,r-bigmemory,R,Data.table,Readr,R Bigmemory,我有一个目录,31个压缩TSVs 2.8 GB压缩/40 GB未压缩。我希望根据1列的值有条件地导入所有匹配行,并合并到一个数据帧中 我已经在这里通读了几个答案,但似乎没有一个是有效的——我怀疑它们不是用来处理那么多数据的 简言之,我怎样才能: 读取3 GB的gzip文件 仅导入列与特定值匹配的行 将匹配行合并到一个数据帧中。 数据是整洁的,只有4列感兴趣:日期、ip、类型str、类别str 我尝试使用read_tsv_chunked的第一件事是: 看起来它开始工作了,但后来被锁起来了。我不知道

我有一个目录,31个压缩TSVs 2.8 GB压缩/40 GB未压缩。我希望根据1列的值有条件地导入所有匹配行,并合并到一个数据帧中

我已经在这里通读了几个答案,但似乎没有一个是有效的——我怀疑它们不是用来处理那么多数据的

简言之,我怎样才能:

读取3 GB的gzip文件 仅导入列与特定值匹配的行 将匹配行合并到一个数据帧中。 数据是整洁的,只有4列感兴趣:日期、ip、类型str、类别str

我尝试使用read_tsv_chunked的第一件事是:


看起来它开始工作了,但后来被锁起来了。我不知道如何在map/str_c调用中将select=ccolnames参数传递给fread,更不用说一列的筛选条件了。

这更像是一个策略答案

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

我建议您做的就是使用ApacheSpark进行数据处理,并使用R包Sparkyr与之进行接口。然后,您可以将数据加载到Spark中,在Spark中进行处理,然后将汇总的数据集检索回R中,以进行进一步的可视化和分析

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

读一读这个

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

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

首先,如果使用了base read.table,则无需压缩任何内容,因为它使用Zlib直接读取这些内容。如果指定了colClasses参数,read.table的运行速度也会更快

您可能需要编写一些定制的R代码,直接从31个TSV中的每个TSV生成一个融化的数据帧,然后通过RBIND累积它们

尽管如此,拥有一台拥有大量快速虚拟内存的机器还是有帮助的。我经常按这个顺序处理数据集,有时我发现Ubuntu系统缺少内存,即使它有32个内核。我有一个替代系统,我已经说服了操作系统SSD更多的是它的内存,给了我一个有效的64 GB RAM。我发现这对于其中一些问题非常有用。这是Windows,所以我需要设置内存。limitsize=。。。适当地

请注意,一旦使用read.table读取TSV,它就相当压缩,接近gzip提供的效果。如果你这样做,你可能不需要一个大系统


如果结果显示需要很长时间,我对此表示怀疑,请确保在中间的点处检查并保存.image。

数据是什么样子的?你试过什么?同样重要的是:你的电脑有多少内存?请重复这个问题。这包括示例代码,包括列出非base R包、示例数据(例如dputheadx)和预期输出。参考文献:,和。它们有多少个文件,即每个文件有多大?根据您所做的工作,shell tools cut/grep/awk可能是有用的辅助工具…补充说,如果还需要其他帮助,请告诉我。谢谢1直接在fread之后添加fread参数-在映射的帮助中。。。是传递附加参数的地方:mapstr_cgunzip-c,files,fread,select=c'mycol'2您可以尝试使用一个命令来过滤mapstr__c'gunzip-c,files,'grep purchase',freadA可能的解决方案是使用包{bigreadr}免责声明:我是作者,适合读取您的数据并将其附加到SQLite数据库中。谢谢!将来遇到类似情况时,我会记住这一点:
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() # %>%
 #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))