我有一个RoR应用程序和一个cron rake-task,类似于:
Model.all.each do |m|
if m < some_condition
m.do_something
m.save
end
endModel有1,000,000条记录(其中有200,000条条件可接受)。有什么方法可以提高任务内存的使用率吗?它占用了on的内存,并且Ruby进程在生产环境中被服务器终止。我的数据库是PostgreSQL。
发布于 2013-02-14 23:17:51
你应该使用像#find_each和#find_in_batches这样的方法。这些操作一次只加载一小部分记录。看看ActiveRecord::Batches吧。
发布于 2013-02-14 23:20:17
我建议使用find_each,它可以批量生成您的对象。
此外,如果可能,在sql中应用您在循环中的条件,这样ActiveRecord就不必实例化您不使用的对象(并因此使用内存):
Model.find_each(:conditions => {:my => :condition}).each do |m|
# do something
end发布于 2013-02-15 00:14:07
您可以尝试以下方法:
def with_gc(enum)
count = enum.count
limit = 100
(0..count).select{|i| i % limit == 0}.each do |index|
new_count = enum.count
raise "query depends on updated param. Expected count #{count}, got #{new_count}" if count != new_count
enum.skip(index).limit(limit).each do |record|
yield record
end
GC.start
end
end你可以这样使用它:
with_gc(Model.all) do |m|
if m < some_condition
m.do_something
m.save
end
endhttps://stackoverflow.com/questions/14877984
复制相似问题