[英]Update huge data in rake task
我有一个名为PageDensity
的模型,它有大约500万行。
当我创建项目PageDensity
表时,在density
PageDensity
中存储5位小数精度的浮点数。
现在,要求已更改为将其四舍五入到小数点后两位。
我只是写了一个任务来舍入所有densities
但是它使系统如此沉重,以至于卡住了。 甚至我不能使用query
因为我的舍入是位更改,例如0.57500
将舍入为0.57
和0.57600
将舍入为0.58
。
到目前为止,我尝试过的只是:
task round_densities: :environment do
application_object = ApplicationController.new
time = Benchmark.realtime do
ActiveRecord::Base.transaction do
PageDensity.all.each {|p| p.update_attributes(density: application_object.round_number(p.density))}
end
end
puts '***************************************'
puts "Total Time Consumed #{time} seconds"
puts '***************************************'
end
而且我还尝试查询四舍五入,但失败了:
select round(0.00500, 2)
#this returns 0.01 as this should return 0.00
我正在使用postgres
任何想法使其成为psql query
或通过使用rails
吗?
您应该批量处理,所以要改变
PageDensity.all.each
有:
PageDensity.all.find_each
检查文件 。
但是要这样做,您必须删除实际上没有用的交易。
旁注,如果没有要触发的回调,请替换:
p.update_attributes(density: application_object.round_number(p.density))
有:
p.update_column(:density, application_object.round_number(p.density))
这样可以节省一些时间。
听起来您的舍入要求仅比正常的舍入少了0.001。
在这种情况下,我认为您可以运行sql更新:
update page_densities set density = round(density - 0.001, 2)
这将是这样的:
0.011 => round(0.010, 2) => 0.01
0.015 => round(0.014, 2) => 0.01
0.016 => round(0.015, 2) => 0.02
0.02 => round(0.019, 2) => 0.02
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.