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”的问题
请给我给予解决办法我怎样才能做到这一点
2条答案
按热度按时间s71maibg1#
这是个有趣的问题。
当调用
data.to_json
时,它从数据库加载所有记录,并为每一行示例化一个ActiveRecord
Ruby对象,最后将每行序列化回JSON。对于超过1000行的数据,这并不高效,尤其是在Ruby中。正如注解中所建议的那样,您首先需要高效地批量查询记录,然后将每个记录(或批量)追加到JSON文件中。这是一个概念证明:
注意:在这个POC中,你需要找到一种方法来删除最后一个元素的结尾逗号,以获得一个有效的JSON。
参考文献:
#find_each
:https://apidock.com/rails/ActiveRecord/Batches/find_each#find_in_batches
:https://apidock.com/rails/ActiveRecord/Batches/find_in_batchesyws3nbqq2#
是的尝试和上述答案是工作正常,谢谢,我也尝试了不同的方法来达到目的地(使用db_dump传输大数据集).下面是代码:
在终端运行这个,它可能不是正确的方式,但我可以做我的工作