【问题标题】:R Cannot allocate memory though memory seems to be availableR 尽管内存似乎可用,但无法分配内存
【发布时间】:2012-09-01 14:58:19
【问题描述】:

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

cannot popen 'ls', probable reason 'Cannot allocate memory'

注意:对于这个问题,我什至尝试了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    

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

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

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

哪种方法适合清理我的所有对象并为每个循环释放内存,这样当我需要调用 system() 命令时不会出现内存问题?

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

【问题讨论】:

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

标签: r memory memory-management amazon-ec2


【解决方案1】:

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

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 中保存了所需的所有内容,将在重启时加载)

【讨论】:

  • 这是一个非常有趣的方法,我将修改我的代码以使用您的方法,看看它是否有效,但如果它“从我离开的地方加载”我想它会正常工作。非常感谢您一直以来对我的帮助。
  • 我认为gc() 更有可能是你的票
  • 在我的第一次测试中,我可以确认这个答案可以正常工作!不幸的是,在调用 system() 函数之前使用 rm(list = ls()) gc() 没有。我还没有测试在每个循环结束时调用rmgc 是否有效,也许这会释放内存并以某种方式到达system 并提供更多可用内存
  • 这是一种非常有趣的方法,适用于那些由于碎片/其他原因没有多少 gc() 调用会有所帮助的绝望情况。
  • 可能想将wait = FALSE 添加到system 调用中,以避免将旧进程(及其内存)挂在操作系统中。我用这种方法创建了一个内存稳定循环(在system 调用中使用Rscript)。
猜你喜欢
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 2013-08-25
  • 2018-11-10
  • 2011-11-10
  • 1970-01-01
相关资源
最近更新 更多