12

いくつかのモデルを実行した後system()、Rスクリプトでコマンドを実行して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()シャットダウンを呼び出す直前にすべてのオブジェクトを試しましたが、同じエラーが続きます。

これが私のシステムのデータです。これは大きなEC2Ubuntuインスタンスです。

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個ではなく1個のモデルを実行すると正常に動作するためrm()、使用済みのオブジェクトを実行したにもかかわらず、実行するたびにメモリが解放されない可能性があることに気付きました。

また、Rを閉じて再起動し、それを呼び出すと機能することにも気づきましたsystem()script.shR内でRを再起動する方法がある場合は、それをフローに追加できます。

すべてのオブジェクトをクリーンアップし、ループごとにメモリを解放して、system()コマンドを呼び出す必要があるときにメモリの問題が発生しないようにする適切な方法はどれですか?

正しい方向へのヒントは大歓迎です!ありがとう

4

1 に答える 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.LastRを終了したときに実行される関数を作成します。.Last関数はRの新しいセッションを開始します。また.First、Rが再起動されるとすぐに実行される関数を作成します。この.First関数は、必要なパッケージをロードしてクリーンアップします。

これで、Rを終了すると、必要なもののロードが再開されます。

q("no")保存しないことを意味しますが、.RData再起動時にロードされる必要なものはすべてすでに保存されています)

于 2012-09-07T18:54:55.143 に答える