我试图找到一种更有效的方法来支持使用uuids填充ActiveRecord模型。大约有500K记录。
这是我目前正在尝试的内容:
clause = ['uuid is null and created_at >= ?', DateTime.new(2017, 8, 15)]
MyTable.where(clause) do |record|
record.uuid = SecureRandom.uuid
record.save
end
这会产生多个更新语句,效率很低。
我查看了update_all,但更新部分似乎只被评估一次,因此为所有记录设置了相同的UUID。
MyTable.where(clause).update_all(uuid: SecureRandom.uuid)
有没有办法用这些条件进行批量更新,并为每个条件生成一个新的UUID?
答案 0 :(得分:0)
Person.find_each do |person| # will only load 1000 records at a time
person.do_awesome_stuff
end
就是为了做到这一点:http://api.rubyonrails.org/classes/ActiveRecord/Batches.html
循环[大]记录集[...]是非常低效的,因为它会尝试一次实例化所有对象。
[...]批处理方法允许您批量处理记录,从而大大减少内存消耗。
find_each方法使用批量大小为1000(或者由:batch_size选项指定)。
def Signal_Handler(signal):
FIFO.push(signal.job_data)
def main(job_data):
while True:
process_Job(job_data)
job_data = FIFO.pop()
if not job_data:
break
if __name__ == '__main__':
job_data = sys.argv[1]
if Lock_Programm():
# First Instance
Signal.Handler(SIG_USR1, Signal_Handler)
main(job_data)
Unlock_Programm()
else:
# Lock failed other Instance is running
Signal.signal(SIG_USR1, job_data)
exit(1)