如何在使用大文件的R循环中防止内存问题?

如何在使用大文件的R循环中防止内存问题?,r,memory-management,large-files,R,Memory Management,Large Files,我正在尝试使用大文件/矩阵(WindowsVista 64位,4GRAM)在R(2.15.0)中运行for循环。如果我对这个循环进行一次迭代,它就可以正常工作。但是,如果我在多个文件上运行循环(我想执行数百个),我的内存就会耗尽。我试图在循环结束时删除文件,但它不会将内存返回到Windows(正如我在Windows任务管理器中看到的那样)。似乎R试图从我的操作系统中获得越来越多的内存,而不是在删除文件后使用内部可用的内存。有什么解决办法吗?如果您需要有关研究问题的更多详细信息,我很乐意与您分享其

我正在尝试使用大文件/矩阵(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