R无法分配内存,尽管似乎有可用的内存

12

运行了几个模型之后,我需要在我的R脚本中运行一个system()命令来关闭我的EC2实例,但是当我到达那个点时,我会得到以下错误:

cannot popen 'ls', probable reason 'Cannot allocate memory'
注意:对于这个问题,我甚至尝试了 ls ,但它没有起作用。
我的脚本的流程如下:
加载模型(约为 2GB)。
挖掘文档并写入 MySQL 数据库。
使用不同大小平均为 2GB 的不同模型重复上述步骤约 20 次。
终止实例。
此时需要调用 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    

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

我注意到,如果只运行一个模型而不是20个,它就能正常工作,因此可能是在每次运行后内存没有被释放,尽管我使用了rm()来清除已使用的对象

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

什么是适当的方式来清除所有对象并释放内存,以便在每次循环时都能调用system()命令而没有内存问题?

任何指向正确方向的提示都将不胜感激!谢谢


在执行 rm() 后,执行 gc() 强制进行垃圾收集,看看是否有所帮助。 - GSee
3
你可以像这样重新启动 Rassign(".Last", function() system("R"), pos=.GlobalEnv); q("no") - GSee
非常感谢!我现在正在尝试两个选项。我猜重启选项可以解决我的问题,虽然这可能不是最优雅的方式。 - JordanBelf
2
显然重新启动R会杀死q("no")行以下的所有内容,因此我无法完成脚本的执行。我将尝试使用其他选项。 - JordanBelf
我在EC2上遇到了同样的问题,重启R“解决了”它。 - Konstantinos
1个回答

10

我发这篇文章是因为它太长了,无法放在评论区。由于你没有提供任何代码,所以很难给出建议。但是,下面是一些代码,也许可以供你参考。

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")

你可以将所需内容保存在名为.RData的文件中。创建一个.Last函数,当退出R时运行该函数。.Last函数将启动一个新的R会话。创建一个.First函数,在重新启动R时立即运行该函数。.First函数将加载所需的包并进行清理。
现在,你可以退出R并重新启动它以加载所需的东西。
(q("no")表示不保存,但你已经将所有需要的内容保存在.RData中,在重新启动时将被加载)

这是一个非常有趣的方法,我会对我的代码进行修改以适应你的方法,并看看它是否有效。虽然如果它能够“从我离开的地方加载”,我猜它应该能正常工作。非常感谢你花费的所有时间帮助我。 - JordanBelf
我认为 gc() 更可能是你的解决方法。 - GSee
在我的第一次测试中,我可以确认这个答案很好用!不幸的是,在调用system()函数之前使用rm(list = ls())gc()并没有起作用。我还没有测试在每个循环结束时调用rmgc是否有效,也许那样会释放内存,并以某种方式使更多的RAM可用于system - JordanBelf
这是一个非常有趣的方法,适用于那些由于碎片化/其他原因,无论调用多少gc()也无济于事的绝望情况。 - vc273
1
可能需要在system调用中添加wait = FALSE,以避免旧进程(及其内存)挂在操作系统中。我使用这种方法创建了一个内存稳定的循环(使用system调用中的Rscript)。 - Morten Grum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接