用R打开大文件,这些文件不适合RAM

时间:2018-01-28 11:27:31

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

我需要打开,处理和合并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") 

1 个答案:

答案 0 :(得分:2)

为了防止对其他人有帮助,我意识到解压缩bz2内的fread()文件消耗了太多RAM。所以,我的解决方案是首先解压缩bz2个文件,然后通过用以下代码替换fread行来运行上面的循环:

  dt <- fread(i, header=F)

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