如何在使用大文件的R循环中防止内存问题?
我正在尝试使用大文件/矩阵(WindowsVista 64位,4GRAM)在R(2.15.0)中运行for循环。如果我对这个循环进行一次迭代,它就可以正常工作。但是,如果我在多个文件上运行循环(我想执行数百个),我的内存就会耗尽。我试图在循环结束时删除文件,但它不会将内存返回到Windows(正如我在Windows任务管理器中看到的那样)。似乎R试图从我的操作系统中获得越来越多的内存,而不是在删除文件后使用内部可用的内存。有什么解决办法吗?如果您需要有关研究问题的更多详细信息,我很乐意与您分享其余内容,以找到合适的解决方案 已经谢谢你了!干杯,强盗如何在使用大文件的R循环中防止内存问题?,r,memory-management,large-files,R,Memory Management,Large Files,我正在尝试使用大文件/矩阵(WindowsVista 64位,4GRAM)在R(2.15.0)中运行for循环。如果我对这个循环进行一次迭代,它就可以正常工作。但是,如果我在多个文件上运行循环(我想执行数百个),我的内存就会耗尽。我试图在循环结束时删除文件,但它不会将内存返回到Windows(正如我在Windows任务管理器中看到的那样)。似乎R试图从我的操作系统中获得越来越多的内存,而不是在删除文件后使用内部可用的内存。有什么解决办法吗?如果您需要有关研究问题的更多详细信息,我很乐意与您分享其
> library(VariantAnnotation)
> fi<-list.files("E:/1000genomes/chr22",full.names=T)
> for(i in 1:length(fi)) {
+ input=paste("smaller.00", i, ".gz", sep = "")
+ output=paste("geno.", i, ".RData", sep = "")
+ vcf = readVcf(input, "hg19")
+ genotypes=geno(vcf)$GT[,]
+ save(genotypes, file=output)
+ gc()
+ }
Error: scanVcf: Realloc could not re-allocate memory (873600000 bytes)
path: E:\1000genomes\chr22\smaller.002.gz
In addition: Warning messages:
1: In doTryCatch(return(expr), name, parentenv, handler) :
Reached total allocation of 3963Mb: see help(memory.size)
2: In doTryCatch(return(expr), name, parentenv, handler) :
Reached total allocation of 3963Mb: see help(memory.size)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 4543758 242.7 12363911 660.4 18010556 961.9
Vcells 19536404 149.1 61090604 466.1 119317584 910.4
我在internet上发现,从命令提示符运行可能有效,因此我将脚本放在R根目录的文件“runthis.R”中,并运行:Rscript.exe runthis.R--不保存--不还原
它运行了一个额外的文件,然后报告了相同的错误。不知何故,我在分析中犯了一个错误。现在我发现(当然是经过了很多麻烦之后)在我的例子中,rm()后跟gc()命令确实有效!感谢mneI指出这一点:)您是否查看了
R
内存管理文档?是的,我只能找到如何监控内存,而不能找到如何清空内存。除了rm()命令之外,但如上所示,它不起作用……我认为rm(vcf)
只是删除了指向文件连接的指针,但没有关闭实际的连接。实验w/close
垃圾收集可能会有所帮助,但您必须在删除正在重写的对象后运行此操作,否则R
会将对象读取到临时对象,然后覆盖它。一种方法是调用R
的一个新实例来读取和保存每个迭代。\@mnel:我很想每次迭代调用一个新的R实例,但我想我需要用另一种语言编写循环?我没有这方面的经验,因此非常感谢您的帮助。此外,我尝试了rm()和gc()的所有组合,没有一个有效。@安东尼:我正在试验close,但还不能掌握它的功能。
+ save(genotypes, file=output)
+ rm(vcf)
+ rm(genotypes)
+ rm(input)
+ rm(output)
+ rm(getal)
+ rm(i)
+ }
Error: scanVcf: Calloc could not allocate memory (18 of 1 bytes)
path: E:\1000genomes\chr22\smaller.001.gz
In addition: Warning message:
In doTryCatch(return(expr), name, parentenv, handler) :
Reached total allocation of 3963Mb: see help(memory.size)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 2355472 125.8 10798339 576.7 16872405 901.1
Vcells 1992717 15.3 62280756 475.2 105556441 805.4