有一个需求,需要把表中 200w 左右的数据进行一次过滤。比如:过滤的方法是
def check
xxx
end
每一条记录都需要调用一次过滤方法 check 不想一次把 200w 条记录取出来,预测对内存来说会是一个灾难。所以打算使用 find_each。 由于过滤操作不是后台异步操作,所以在使用 find_each 时希望能快一些处理完然后在前台将满足条件的记录马上展示出来。
我先用了一个有 200w 左右数据的表在 rails console 中进行测试。
Benchmark.bm do |b|
b.report("show") {TestOrder.find_each(batch_size: 1000).count}
end
# user system total real 单位是:秒
# show 28.340000 1.200000 29.540000 ( 33.036628)
然后我增加了 batch_size 到 5000
# user system total real 单位是:秒
# show 26.870000 0.840000 27.710000 ( 29.737033)
两次使用的时间差不多。batch_size 为 10000 时也是差不多。 换成打印测试: batch_size 分别为 1000 和 10000
Benchmark.bm do |b|
b.report("show") do
TestOrder.find_each(batch_size: 1000).each do |p|
puts p.id
end
end
end
两次结果大约需要 50s。 不能让用户等 20s 的时间,所以想请教是否有优化的方法,使 find_each 的效率更高呢?或者有其他更好的方法(除了异步的操作方法外)