11

短縮版

RがUNIXマシン上の仮想メモリを使用しないようにする方法はありますか?それが起こるときはいつでも、それは私が失敗したので、計算を中止したいからです。

長いバージョン

私は他の何人かの人々と共有されている強力なコンピューター上で大きなデータセットを扱っています。時々、使用可能なよりも多くのRAMを必要とするコマンドを開始します。これにより、Rがスワッピングを開始し、最終的にマシン全体がフリーズします。通常、これを解決するulimitには、~/.bashrc

ulimit -m 33554432 -v 33554432  # 32 GB RAM of the total 64 GB

これにより、使用可能なメモリよりも多くのメモリを割り当てようとすると、Rはエラーをスローし、中止します。ただし、並列化(通常はsnowパッケージを使用)時にこの種のミスを犯しulimitても効果はなく、とにかくマシンがクラッシュします。snowこれは、bashで実行されない個別のプロセスとしてワーカーを起動するためだと思います。ulimit代わりにを設定しようとすると~/.Rprofile、エラーが発生します。

> system("ulimit -m 33554432 -v 33554432")
ulimit: 1: too many arguments

誰かが私がこれを達成する方法を見つけるのを手伝ってもらえますか?

サイドトラック

なぜulimit0の仮想メモリを設定できないのbashですか?

$ ulimit -m 33554432 -v 0

私がそうすると、すぐにシャットダウンします。

4

1 に答える 1

11

実行system("ulimit")すると、子プロセスで実行されます。親は親からを継承しませんulimit。(これは、、system("cd dir")またはを実行することに類似していsystem("export ENV_VAR=foo")ます。

環境を起動するシェルに設定するのが正しい方法です。並列の場合、制限は機能していません。これは、プロセスごとの制限であり、グローバルシステムの制限ではないためです。

Linuxでは、厳密なオーバーコミットアカウンティングを構成できます。これにより、カーネルmmapが物理メモリでバックアップできない要求を処理できないようにします。

これは、sysctlパラメーターvm.overcommit_memoryとを調整することによって行われますvm.overcommit_ratio。(これらについてのグーグル。)

これは、スラッシング状況を防ぐための効果的な方法です。ただし、トレードオフは、物事が適切に動作している場合(より多くの/より大きなプロセスをメモリに詰め込む)にオーバーコミットが提供する利点を失うことです。

于 2012-04-24T18:01:06.890 に答える