シミュレーションコードをベクトル化する過程で、メモリの問題が発生しました。 Windows XPで32ビットRバージョン2.15.0(RStudioバージョン0.96.122経由)を使用しています。私のマシンには3.46 GBのRAMがあります。
> sessionInfo()
R version 2.15.0 (2012-03-30)
Platform: i386-pc-mingw32/i386 (32-bit)
locale:
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] Matrix_1.0-6 lattice_0.20-6 MASS_7.3-18
loaded via a namespace (and not attached):
[1] grid_2.15.0 tools_2.15.0
問題の最小限の例を次に示します。
> memory.limit(3000)
[1] 3000
> rm(list = ls())
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 1069761 28.6 1710298 45.7 1710298 45.7
Vcells 901466 6.9 21692001 165.5 173386187 1322.9
> N <- 894993
> library(MASS)
> sims <- mvrnorm(n = N, mu = rep(0, 11), Sigma = diag(nrow = 11))
> sims <- mvrnorm(n = N + 1, mu = rep(0, 11), Sigma = diag(nrow = 11))
Error: cannot allocate vector of size 75.1 Mb
(私のアプリケーションでは、共分散行列Sigmaは対角線ではありませんが、どちらの方法でも同じエラーが発生します。)
私は午後にRのメモリ割り当ての問題について読みました( here 、 here および here を含む)。私が読んだことから、それは利用可能なRAM自体の問題ではなく、利用可能な連続アドレス空間の問題であるという印象を受けます。
あなたが持つかもしれない考えや提案を大いに感謝します。
RはOSがそれを割り当てることができなくなるまでになりましたanother 75.1Mb RAMのチャンク。これは、次のサブ操作を実行するために必要なメモリチャンクのサイズです。これは、プロセス全体を完了するために必要な連続RAMの量に関するステートメントではありません。この時点までに、利用可能なRAMメモリを続行します。OSは、Rがこれ以上RAMを使用できるようにすることができません。
これに対する潜在的な解決策は多様です。明らかなのは、より多くのRAMを備えた64ビットマシンを手に入れることです。詳細は忘れましたが、32ビットWindows上のIIRCでは、1つのプロセスで使用できるのは限られた量のRAM(2GB?) RAMは、3.4Gbよりもやや少なくなります。64ビットWindows Rでは、より多くのRAMと最大量を使用できますof RAMフィット/インストールが可能になります。
それが不可能な場合は、別のアプローチを検討してください。おそらく、バッチごとのnがN
よりはるかに小さいバッチでシミュレーションを実行します。そうすれば、はるかに少ない数のシミュレーションを描画し、必要なことを何でも行い、結果を収集し、十分なシミュレーションが完了するまでこのプロセスを繰り返すことができます。 N
が何であるかは表示されませんが、大きいと思われるので、N
を全体的に小さくするために、_N
を何度か小さくしてみてください。
ラスターパッケージを使用しても同じ警告が表示されました。
> my_mask[my_mask[] != 1] <- NA
Error: cannot allocate vector of size 5.4 Gb
解決策は本当にシンプルで、Rのストレージ容量を増やすことで構成されています。ここではコード行です。
##To know the current storage capacity
> memory.limit()
[1] 8103
## To increase the storage capacity
> memory.limit(size=56000)
[1] 56000
## I did this to increase my storage capacity to 7GB
うまくいけば、これが問題の解決に役立つことを願っています
gc()
が役立ちます
データを.RDataとして保存し、Rを閉じて再度開き、RDataをロードすると役立ちます。
ここで私の答えを参照してください: https://stackoverflow.com/a/24754706/190791 詳細
使用するN値に関係なくRは停止しますか?小さい値を使用して、問題がmvrnorm関数であるかどうかを確認するか、単にサブセットでループすることができます。ループにgc()
関数を挿入して、いくつかのRAMを連続的に解放します