【发布时间】: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还是解压后的文件?解压后有多大?
-
@GregoryDemin 谢谢。这是否意味着我必须对每一块数据进行分析?
-
@休。谢谢你。 8GB 是归档数据的总大小。解压后为67GB。我现在尝试先解压缩文件,然后使用
fread(i, header = F)运行上述循环,而不是使用bzcat即时解压缩。 -
@et_ 是的,您必须按块运行分析。没有直接的方法可以将 67Gb 数据适合 8Gb 的 RAM,因此您仅限于核心算法,它不会一次将所有数据加载到内存中。例如,参见用于线性回归的 biglm 包、Vowpal Wobbit 等。
标签: r for-loop data.table large-files