我计划使用延迟作业来运行一些后台分析。在我最初的测试中,我看到了巨大的内存使用量,所以我基本上创建了一个非常简单的任务,它每 2 分钟运行一次,只是为了观察正在使用多少内存。
任务很简单,analytics_eligbile?考虑到数据现在的位置,该方法总是返回 false,因此基本上没有调用任何重击代码。我在开发中的示例数据中有大约 200 个帖子。发布 has_one analytics_facet。
不管这里的内部逻辑/业务如何,这个任务唯一要做的就是调用 analytics_eligible? 每 2 分钟重复 200 次。在 4 小时内,我的物理内存使用量为 110MB,虚拟内存为 200MB。就为了做这么简单的事!我什至无法想象如果它使用真实的生产数据对 10,000 个帖子进行真正的分析,这将消耗多少内存!当然,它可能不会每 2 分钟运行一次,更像是每 30 分钟运行一次,但我仍然认为它不会飞。
这是在 Ubuntu 10.x 64 位上运行 ruby 1.9.7、rails 2.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