R虽然内存似乎可用,但无法分配内存

Jor*_*elf 8 memory memory-management r amazon-ec2

运行几个模型后,我需要system()在我的R脚本上运行一个命令来关闭我的EC2实例,但当我到达那一点时,我得到:

cannot popen 'ls', probable reason 'Cannot allocate memory'
Run Code Online (Sandbox Code Playgroud)

注意:对于这个问题,我甚至尝试了ls哪些不起作用

我的脚本流程如下

  • 加载模型(约2GB)
  • 挖掘文档并写入MySQL数据库

使用不同型号重复上述步骤约20次,每个型号平均尺寸为2GB

  • 终止实例

此时是我需要调用system("sudo shutdown -h now")而没有任何反应,但是当我尝试时,system("sudo shutdown -h now",intern=TRUE)我得到了分配错误.

rm()在调用关机之前尝试了所有对象,但同样的错误仍然存​​在.

这是我系统上的一些数据,它是一个大型的EC2 Ubuntu实例

R version 2.15.1 (2012-06-22)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=C                 LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] splines   stats     graphics  grDevices utils     datasets  methods  
[8] base     

other attached packages:
 [1] RTextTools_1.3.9   tau_0.0-15         glmnet_1.8         Matrix_1.0-6      
 [5] lattice_0.20-10    maxent_1.3.2       Rcpp_0.9.13        caTools_1.13      
 [9] bitops_1.0-4.1     ipred_0.8-13       prodlim_1.3.2      KernSmooth_2.23-8 
[13] survival_2.36-14   mlbench_2.1-1      MASS_7.3-21        rpart_3.1-54      
[17] e1071_1.6-1        class_7.3-4        tm_0.5-7.3         nnet_7.3-4        
[21] tree_1.0-31        randomForest_4.6-6 SparseM_0.96       RMySQL_0.9-3      
[25] ggplot2_0.9.1      DBI_0.2-5         

loaded via a namespace (and not attached):
 [1] colorspace_1.1-2   dichromat_1.2-4    digest_0.5.2       grid_2.15.1       
 [5] labeling_0.2       memoise_0.1        munsell_0.3        plyr_1.7.1        
 [9] proto_0.3-9.2      RColorBrewer_1.0-5 reshape2_1.2.1     scales_0.2.1      
[13] slam_0.1-25        stringr_0.6.1    
Run Code Online (Sandbox Code Playgroud)

gc()返回

          used (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells 1143171 61.1    5234604  279.6   5268036  281.4
Vcells 1055057  8.1  465891772 3554.5 767962930 5859.1
Run Code Online (Sandbox Code Playgroud)

我注意到,如果我只运行1个模型而不是20个它可以正常工作,那么可能是每次运行后内存都没有获得自由,尽管我做rm()了使用过的对象

我还注意到,如果我关闭R并重新启动它然后调用system()它.如果有一种方法可以在R中重新启动R,那么我可以将其添加到我的script.sh流程中.

这将是清理所有对象并让内存为每个循环释放的适当方法,所以当我需要调用system()命令时,没有内存问题?

任何正确方向的提示将非常感谢!谢谢

GSe*_*See 7

我只是张贴这个,因为它太长,不适合评论.由于您没有包含任何代码,因此很难提供建议.但是,这里有一些你可以考虑的代码.

wd <- getwd()
assign('.First', function(x) {
  require('plyr') #and whatever other packages you're using
  file.remove(".RData") #already been loaded
  rm(".Last", pos=.GlobalEnv) #otherwise won't be able to quit R without it restarting
  setwd(wd)
}, pos=.GlobalEnv)
assign(".Last", function() {
  system("R --no-site-file --no-init-file --quiet")
}, pos=.GlobalEnv)
save.image() #or only save the things you want to be reloaded.
q("no")
Run Code Online (Sandbox Code Playgroud)

我们的想法是将您需要的东西保存在一个名为的文件中.RData.您创建了一个.Last在退出R时运行的.Last函数.该函数将启动R的新会话.并且您创建一个.First将在R重新启动后立即运行的函数.该.First函数将加载您需要的包并进行清理.

现在,您可以退出R,它将重新启动加载您需要的东西.

(q("no")表示不保存,但您已经保存.RData了重启时将加载的所有内容)