2011-01-13 16 views
2

かなり複雑なネストされたハッシュデータ構造をいくつか作成し、条件付きでデータベースレコードを作成するスクリプトを繰り返しています。これは、アクティブなレコードを使用するスタンドアロンのスクリプトです。数分間実行した後、私はサーバーの応答性に大きな遅れがあることに気づき、スクリプトがnice +19に設定されている間に、サーバーの総メモリの85%〜90%を安定して楽しんでいることを発見しました。ルビのローカル変数とインスタンス変数の違い

この場合、インスタンス変数を読みやすくするために使用しています。ループ外で何が再利用されるのか、それから何が再利用されないのかを知るのに役立ちます。インスタンス変数が必要ないときにインスタンス変数を使用しない理由はありますか?ローカル変数とインスタンス変数のメモリ割り当てと管理に違いはありますか? @variable = nilが必要なくなったときに設定するのに役立つでしょうか?

+0

合計サーバーメモリは何ですか? Rubyはあるレベルでガベージコレクションを開始します。 – stef

+0

その4G仮想サーバー。どの時点でガベージコレクションが開始されるのか分かりますか? – fflyer05

答えて

2

設定値@variable = nilは、インスタンス変数が指していたオブジェクトへの参照を破棄します。オブジェクトへの残りの参照がなくなると、最終的にガベージコレクタによって収集されます。 GCはいくぶん予測できないので、私は「結局」と言います。しかし、「ダングリングリファレンス」と(GCの実装方法によっては)循環参照によってメモリリークが発生するのは簡単です。このオブジェクトにはほかにどのようなものがありますか?

+1

a)または@variableを他の値に設定すると、参照が解放されます。 b)[GC.start'](http://www.ruby-doc.org/core/classes/GC.html)を呼び出して、必要に応じてガベージコレクションを開始することができます。 – Phrogz

5

インスタンス変数は、それを保持するオブジェクトの存続期間中も存在し続けます。ローカル変数は、単一のメソッド、ブロック、またはモジュール本体内にのみ存在します。

オブジェクトのインスタンス変数内のオブジェクトが将来参照するつもりがないためガベージコレクションされると仮定している場合は、その動作方法ではありません。ガベージコレクタは、オブジェクトへの到達可能な参照があるかどうかしか知りません。また、それがインスタンス変数にあるかどうかもわかります。

+0

もちろん、インスタンス変数vのローカル変数は、OPのパフォーマンス上の問題とはまったく関係がありません。つまり、彼の(誤った)推測です。 –

+0

@Ed Swangren:それが他のものであることが判明しても、私は驚くことはありません。しかし、それは関連する可能性もあるようです。彼の質問はやや曖昧ですが、多くの計算を実行し、すべての中間値と結果をインスタンス変数に格納し、数分間実行すると、多くのメモリを消費する可能性があります。 – Chuck

+0

私も同じ疑いがあります。 @Chuck Rubyのローカル変数とインスタンス変数のメモリ割り当てと解放の方法とタイミングについて教えてください。 – Abhi

関連する問題