【发布时间】:2021-02-04 21:59:54
【问题描述】:
与 ActiveRecord 相比,我试图在包含大约 500,000 条记录的 csv 数据之间获取添加、删除和更新的增量。
iden 是他们差异的标识符
例如。 csv_data
[{
iden: 1, group_num: 111
},
{
iden: 2, group_num: 222
},
{
iden: 3, group_num: 333
},
{
iden: 4, group_num: 444
}]
例如。活动记录数据
[{
iden: 2, group_num: 222
},
{
iden: 3, group_num: 333
},
{
iden: 4, group_num: 999
},
{
iden: 5, group_num: 555
}]
结果我想得到
添加的数组
[{
iden: 5, group_num: 555
}]
删除数组
[{
iden: 1, group_num: 111
}]
一组更新
[{
iden: 4, group_num: 999
}]
我尝试遍历每个以获取特定的增量,但对于数十万个大型数据集需要花费数小时。我该如何更好地优化它?
additions = []
updates = []
csv_data.each_slice(1000).map do |chunk|
chunk.map { |csv_item|
active_record = ActiveRecordData.where(iden: csv_item[:iden])
if !active_record.exists?
additions << active_record
elsif active_record.first.group_num != csv_item[:group_num]
updates << active_record
end
}
end
deletions = ActiveRecordData.all.select{|active_record| !csv_data.any?{|csv_item| csv_item[:iden] == active_record.iden}}
【问题讨论】:
标签: ruby-on-rails ruby