繁体   English   中英

在rake任务中更新海量数据

[英]Update huge data in rake task

我有一个名为PageDensity的模型,它有大约500万行。

当我创建项目PageDensity表时,在density PageDensity中存储5位小数精度的浮点数。

现在,要求已更改为将其四舍五入到小数点后两位。

我只是写了一个任务来舍入所有densities但是它使系统如此沉重,以至于卡住了。 甚至我不能使用query因为我的舍入是位更改,例如0.57500将舍入为0.570.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM