我需要打开,处理和合并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")
答案 0 :(得分:2)
为了防止对其他人有帮助,我意识到解压缩bz2
内的fread()
文件消耗了太多RAM。所以,我的解决方案是首先解压缩bz2
个文件,然后通过用以下代码替换fread
行来运行上面的循环:
dt <- fread(i, header=F)
当然,我使用了更多的硬盘空间。