如何将大型活动记录数据转换为JSON格式-笔记本电脑在data.to_json期间卡住并挂起-导出,在ROR中导入

ffdz8vbo  于 2023-10-21  发布在  其他
关注(0)|答案(2)|浏览(109)
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”的问题
请给我给予解决办法我怎样才能做到这一点

s71maibg

s71maibg1#

这是个有趣的问题。
当调用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。
参考文献:

yws3nbqq

yws3nbqq2#

是的尝试和上述答案是工作正常,谢谢,我也尝试了不同的方法来达到目的地(使用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

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

相关问题