0

Java プログラムから呼び出される Rscript があります。スクリプトの目的は、ggplot で一連のグラフを自動的に生成し、それらを pdf に分割することです。それぞれ独自のスクリプトから呼び出される約 30 個のグラフで、やや大きくなっています。

入力は 5 ~ 20 MB のタブ区切りのファイルですが、R セッションでは最大 12 GB の RAM が使用されることがあります (Mac では 10.68 btw ですが、これはすべてのプラットフォームで実行されます)。

オブジェクトのメモリ サイズを確認する方法について読みましたが、25 MB を超えるものはなく、すべての関数とすべてのフィルター ステップのすべてをディープ コピーしたとしても、このレベルに近づくべきではありません。

gc() も試してみましたが、役に立ちませんでした。gcinfo(TRUE) を実行してから gc() を実行すると、38MB の RAM を使用していることがわかります。しかし、アクティビティモニターは最大12GBになり、おそらくhdのページングが原因で速度が低下します.

ulimit -v 800000 を実行したbashスクリプトを介して呼び出してみましたが、うまくいきませんでした。

他に何ができますか?

4

2 に答える 2

1

割り当てを行う過程で、R は常に一時的なコピーを作成します。一時的な割り当てごとに、割り当てられたオブジェクトのフル サイズの連続したメモリが必要になります。したがって、通常のアドバイスは、利用可能な連続メモリ量の少なくとも 3 倍を計画することです。これは、R がメモリをどのように使用しているかを認識するだけでなく、R 以外の他のプログラムがシステム リソースをめぐって競合している数についても考慮する必要があることを意味します。コンピュータを再起動して、R のみを実行し、成功すれば。

20MB の入力ファイルは、ファイルの構造に応じて、かなり大きくなる可能性があります (double ごとに 8 バイト、ベクトル内の文字要素ごとにおそらくそれ以上)。大きなファイル内の各ポイントをプロットする場合、pdf ファイル オブジェクトもかなりのスペースを必要とします。

私の経験は、コメントした他の人と同じではありません。gc()メモリを集中的に使用する操作を行う前に問題を解決します。コードを提供し、「ダメ」の意味を説明する必要があります。エラーが発生したり、仮想メモリの使用を監視したりしていますか...または何ですか?

于 2012-11-12T03:55:11.187 に答える
0

コードを含むより包括的な説明を投稿していないことをお詫びします。入力と同様にかなり長かった。しかし、ここで得た回答は依然として非常に役に立ちました。これが私が主に問題を解決した方法です。

可変数の列があり、いくつかの外れ値が非常に多くなりました。しかし、極端な外れ値は必要なかったので、それらを除外して余分な列を切り捨てました。これだけで、メモリ使用量が大幅に減少しました。以前は仮想メモリの使用量を見たことがありませんでしたが、200 GB もの高さになることもありました (笑)。これにより、最大2GBになりました。

各グラフは、独自の関数で作成されました。そこで、すべてのグラフが最初に生成され、次に pdf に出力され、次に rm(graphname) になるようにコードを再配置しました。

さらに、データ フレームに新しい列を作成するループがたくさんありました。これを行う代わりに、これらの計算でデータ フレームに関連付けられていないベクトルを作成しました。これには実際、一部のコードが大幅に簡素化されるという利点がありました。

次に、既存のデータフレームに列を追加せず、代わりに列ベクトルを作成した後、400mb に減らしました。これは、私が使用すると予想するよりもまだ多いですが、私の制限の範囲内です. 私のユーザーはすべて私の会社に所属しているため、どのコンピューターで実行するかをある程度制御できます。

于 2012-11-16T00:17:45.730 に答える