提问人:Prathviraj Shettigar 提问时间:10/17/2023 最后编辑:Prathviraj Shettigar 更新时间:10/18/2023 访问量:55
如何将大型活动记录数据转换为 json 格式 - 笔记本电脑在data.to_json过程中卡住并挂起 - 在 ROR 中导出、导入
How to convert large active record data to json format - laptop get stucked and get hang during data.to_json - export, import in ROR
问:
user_mails = UserMail.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”的问题,
请给出解决方案,我怎样才能做到这一点
答:
0赞
Dumitru Ceban
10/18/2023
#1
这是一个有趣的问题。
当您调用它时,它会从数据库中加载所有记录,并为每一行实例化一个 Ruby 对象,最后将每一行序列化回 JSON。对于 >1000 行,这是不有效的,尤其是在 Ruby 中。data.to_json
ActiveRecord
正如注释中所建议的,首先需要批量有效地查询记录,然后将每个记录(或批量)追加到 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。
引用:
#find_each
: https://apidock.com/rails/ActiveRecord/Batches/find_each#find_in_batches
: https://apidock.com/rails/ActiveRecord/Batches/find_in_batches
-1赞
Prathviraj Shettigar
10/18/2023
#2
是的,尝试过,上面的答案工作正常,谢谢, 我也尝试过用不同的方法来到达目的地(使用 db_dump 传输大型数据集数据)。 这是代码:
pg_dump -U user_name -d source_db -t table_name -f source_db.sql
psql -U user_name -d destination_db -f source_db.sql
在终端中运行这个,它可能不是正确的方式,但我可以做我的工作
评论