遅延ジョブを使用してバックグラウンド分析を実行することを計画しています。最初のテストでは、大量のメモリ使用量が確認されたため、基本的に、使用されているメモリ量を監視するためだけに2分ごとに実行される非常に単純なタスクを作成しました。
タスクは非常に単純で、analytics_eligbile?データが現在どこにあるかを考えると、メソッドは常にfalseを返すため、基本的に、ヒットするコードは呼び出されません。開発中のサンプルデータには約200件の投稿があります。has_oneanalytics_facetを投稿します。
ここでの内部ロジック/ビジネスに関係なく、このタスクが実行しているのはanalytics_eligibleを呼び出すことだけですか?2分ごとに200回メソッド。たった4時間で、私の物理メモリ使用量は110MB、仮想メモリは200MBになります。こんなに簡単なことをするためだけに!実際の本番データを使用して10,000件の投稿に対して実際の分析を行うと、これがどれだけのメモリを消費するか想像さえできません。確かに、30分ごとのように、2分ごとに実行されない可能性がありますが、それでも飛ぶとは思いません。
これは、Ubuntu 10.x64ビットでruby1.9.7、rails2.3.5を実行しています。私のラップトップには4GBのメモリ、デュアルコアCPUが搭載されています。
Railsは本当にこれほど悪いのでしょうか、それとも私は何か間違ったことをしているのでしょうか?
Delayed::Worker.logger.info('RAM USAGE Job Start: ' + `pmap #{Process.pid} | tail -1`[10,40].strip)
Post.not_expired.each do |p|
if p.analytics_eligible?
#this method is never called
Post.find_for_analytics_update(p.id).update_analytics
end
end
Delayed::Worker.logger.info('RAM USAGE Job End: ' + `pmap #{Process.pid} | tail -1`[10,40].strip)
Delayed::Job.enqueue PeriodicAnalyticsJob.new(), 0, 2.minutes.from_now
ポストモデル
def analytics_eligible?
vf = self.analytics_facet
if self.total_ratings > 0 && vf.nil?
return true
elsif !vf.nil? && vf.last_update_tv > 0
ratio = self.total_ratings / vf.last_update_tv
if (ratio - 1) >= Constants::FACET_UPDATE_ELIGIBILITY_DELTA
return true
end
end
return false
end