【问题标题】:Opening large files with R, which don't fit in RAM用 R 打开不适合 RAM 的大文件
【发布时间】:2018-01-28 11:27:30
【问题描述】:

我需要打开、处理和合并 12 个 .tsv 文件,这些文件被归档为 .bz2 文件,但最终我的系统在以下循环完成之前内存不足。归档文件的总大小为 8GB,我使用的是 120GB RAM 的节点。

我尝试了以下循环,该循环很大程度上基于data.table。关于如何使用 R 打开、处理和合并这些大文件的任何建议?

files <- list.files(path="/mypath", pattern="*.bz2", full.names=T, recursive=FALSE)

a <-data.table()
for(i in files) {
  print(i)
  dt <- fread(sprintf("bzcat %s | tr -d '\\000'", i), header=F)
  dt <- as.data.table(dt)

  dt$domain.ext <- domain(dt$ColA)
  help <- suffix_extract(dt$domain.ext)
  dt <- cbind(dt, help)
  rm(help)
  dt$domain.ext <- NULL 
  dt <- dt[ColB=="something",] 

  dt <- dt[,.(ColA, ColB, ColC, ColD, ColE)] 

  l = list(a,dt)
  rm(dt)
  a <- rbindlist(l, use.names = T, fill = F, idcol=NULL)
  rm(l)
  print(dim(a))
}

some more analysis using functions from data.table and urltools packages

save(a, file="all.RData", compress = "bzip2") 

【问题讨论】:

  • 看看 chunked 包 - CRAN.R-project.org/package=chunked 它有 dplyr 后端,用于处理大文本文件的内存不足。
  • 存档文件大小是8GB还是解压后的文件?解压后有多大?
  • @GregoryDe​​min 谢谢。这是否意味着我必须对每一块数据进行分析?
  • @休。谢谢你。 8GB 是归档数据的总大小。解压后为67GB。我现在尝试先解压缩文件,然后使用fread(i, header = F) 运行上述循环,而不是使用bzcat 即时解压缩。
  • @et_ 是的,您必须按块运行分析。没有直接的方法可以将 67Gb 数据适合 8Gb 的 RAM,因此您仅限于核心算法,它不会一次将所有数据加载到内存中。例如,参见用于线性回归的 biglm 包、Vowpal Wobbit 等。

标签: r for-loop data.table large-files


【解决方案1】:

以防万一它对其他人有帮助,我意识到解压缩 fread() 中的 bz2 文件会消耗太多 RAM。所以,我的解决方案是先解压bz2文件,然后运行上述循环,将fread行替换为以下行:

  dt <- fread(i, header=F)

当然,我使用了更多的硬盘空间。

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2015-12-26
    • 2021-10-27
    • 2018-11-18
    • 1970-01-01
    • 2020-10-30
    相关资源
    最近更新 更多