R中大型.tsv文件的内存处理效率更高

时间:2015-02-02 04:32:33

标签: r memory-management

下面的脚本将一个大的tsv文件加载到内存中的数据框中,然后在文件的每一列上运行一个线性模型。我为一个较小的文件编写了脚本,但后来尝试在较大的文件上重新运行它,它不会加载它(1.3gb)但也不会发出错误信息。

一般情况下,在这种情况下,一个人应该能够从文件中一次读取一列,在这种情况下,这意味着几乎没有任何内容被加载到内存中(这个文件是~600行但是~1000000列)。

但是,我对R很新,并且不确定如何实施这样的解决方案。我可以将文件分成块并在每个块上运行,但我宁愿开始学习read.table()的更好的替代方法,这将使我能够处理可能更大的文件,而无需将所有内容保存在内存中。

在这种情况下,最好的选择是什么?

ICHP<-read.table("aa_ra_gwas_erosions_fornb.raw",header=TRUE)
covfile<-read.table("gwas_erosion_sample_list_covs.txt",header=TRUE)
fhandle<-file("ichip_nb_model.csv","a")
fhandle2<-file("ichip_nb_model_LLR.csv","a")
nullglmmod<-zeroinfl(formula=OverllTot0 ~ sex + pc1 + cohort + ra + DisDurMonths + smoke, data=covfiledt, dist="negbin")
for (i in seq(7, ncol(ICHP), 1)) {
    writeLines(colnames(ICHP)[i], con=fhandle)
    writeLines(colnames(ICHP)[i], con=fhandle2)
        string<-eval(parse(text = paste("ICHP$", colnames(ICHP)[i], sep="")))
    glmmod<-glm.nb(OverllTot0 ~ sex + pc1 + cohort + ra + DisDurMonths + smoke + string, data=covfiledt)
    anovaresults<-anova(glmmod,nullglmmod)
        summ <- coef(summary(glmmod))
        rownames(summ)[8] <- paste0("ICHP$", colnames(ICHP)[i])
        write.table( anovaresults, file=fhandle2)
        write.table( round(summ, 4), file=fhandle)
}

它是第一个文件,它变成了ICHPdt,这是非常大的文件。

1 个答案:

答案 0 :(得分:1)

如果你想使用基数R,而不是只关心速度而只是想通过读取tsv中的某些列来限制内存需求,你仍然可以使用read.table并设置colClasses参数至于"NULL"您想要阅读的列。

例如,如果您有1000列,并且只想阅读第2列和第4列,请将其他所有内容设置为"NULL"

cols <- rep("NULL", 1000)
cols[c(2, 4)] <- NA
read.table("file", colClasses=cols)