我正在尝试从基于 Rails 的服务迁移到另一个框架。我正在尝试使用 rake 任务从 Rails 导出数据并导入到新模式中。
现在我的 rake 任务完成了所有列映射,效果很好。例如,rails 应用程序中的客户现在是新应用程序中的帐户。
问题是我的任务需要几个小时才能完成。基本上我会先
User.find_each
-> 然后 Transaction.find_each
等等。每个表都有数万条记录。
我进行了第一次优化,并删除了尽可能多的数据库调用。我也在尽可能地利用 Redis。在我看来,我已经到了需要同时运行任务的地步。
我研究了使用 parallel gem。文档中的示例如下:
Parallel.each(User.all, in_processes: 8) do |user|
user.update_attribute(:some_attribute, some_value)
end
User.connection.reconnect!
我担心我无法使用它,因为当我调用
Customer.all
时,我的虚拟机冻结了,因为我无法将它们全部保留在内存中(因此是 find_each
)。
我想我的问题是否可以将平行宝石与
find_each
一起使用?我在他们的文档或在线示例中找不到任何这样做的内容。我可以采取另一种解决方案来同时迭代客户吗?
对于这个问题,
是否可以将并行 gem 与 find_each 一起使用?我在他们的文档或在线示例中找不到任何这样做的内容。我可以采取另一种解决方案来同时迭代客户吗?
find_in_batches
。您可以查询一批记录,然后使用 Parallel 迭代该批记录中的每个元素。例如,它可以是这样的
User.find_in_batches do |batch|
Parallel.each(batch,in_processes: 8) do |user|
...
end
end