user_mails = user_mails.all
data = {user_mails: user_mails}
File.open("demo_data.json", "w") { |f| f.write data.to_json }
json_data['user_mails'].each do |data|
UserMail.where(data).first_or_create!
end
当我尝试此操作时,我的系统卡住并挂起,然后我需要重新启动我的系统,我发现“
”中有问题data.to_json
当我单独执行此操作时,系统也会挂起,因此在写入文件期间没有问题,还要注意“
user_mails
包含非常大的数据集,这可能会出现问题。
activity_logs = ActivityLog.all
consumers = Consumer.all
data = {activity_logs: activity_logs, consumers: consumers }
File.open("demo_data.json", "w") { |f| f.write data.to_json }
这工作正常,没有任何问题,因为它们具有中等数据集。
我已经尝试过压缩和压缩,但它不起作用,因为这是“data.to_json”的问题
请给出解决方案我怎样才能实现这个目标
这是一个有趣的问题。
当您调用
data.to_json
时,它会从数据库加载所有记录,并为每一行实例化一个 ActiveRecord
Ruby 对象,最后将每行序列化回 JSON。对于 >1000 行,这效率不高,尤其是在 Ruby 中。
正如评论中所建议的,您首先需要批量有效地查询记录,然后将它们中的每一个(或批量)附加到 JSON 文件中。这是概念证明:
File.open("demo_data.json", 'a') do |file|
# append the header
file.puts("{\"user_mails\": [")
# #find_each or #find_in_batches
user_mails.find_each do |user_mail|
file.puts(user_mail.to_json + ",")
end
# append the footer
file.puts("]}")
end
注意:在此 POC 中,您需要找到一种方法来删除最后一个元素中的尾随逗号,以获得有效的 JSON。
参考资料: