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

问题描述 投票:0回答:1
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”的问题
请给出解决方案我怎样才能实现这个目标

json ruby-on-rails import export gzip
1个回答
0
投票

这是一个有趣的问题。

当您调用

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。

参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.