如何将大型活动记录数据转换为 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

提问人:Prathviraj Shettigar 提问时间:10/17/2023 最后编辑:Prathviraj Shettigar 更新时间:10/18/2023 访问量:55

问:

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”的问题,
请给出解决方案,我怎样才能做到这一点

json ruby-on-rails 导入 导出 gzip

评论

1赞 zaphodbln_ 10/18/2023
您能否分享一下在 user_mails = user_mails.all 之前发生的事情 - 这应该是 UserMails.all 吗?您可以尝试批量加载数据(api.rubyonrails.org/classes/ActiveRecord/Batches.html)并自己创建json文件吗?您似乎也遍历了数据,因此您可以在途中创建文件
0赞 zaphodbln_ 10/18/2023
是否可以选择直接从数据库服务器创建文件?对于 PostgreSQL,请参阅此处:alphahydrae.com/2021/02/... - 对于所有其他 RDBMS 应该相似

答:

0赞 Dumitru Ceban 10/18/2023 #1

这是一个有趣的问题。

当您调用它时,它会从数据库中加载所有记录,并为每一行实例化一个 Ruby 对象,最后将每一行序列化回 JSON。对于 >1000 行,这是不有效的,尤其是在 Ruby 中。data.to_jsonActiveRecord

正如注释中所建议的,首先需要批量有效地查询记录,然后将每个记录(或批量)追加到 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。

引用:

-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 

在终端中运行这个,它可能不是正确的方式,但我可以做我的工作