Rails (rake) 数据同时导入

问题描述 投票:0回答:1

我正在尝试从基于 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
一起使用?我在他们的文档或在线示例中找不到任何这样做的内容。我可以采取另一种解决方案来同时迭代客户吗?

ruby-on-rails database import concurrency rake
1个回答
3
投票

对于这个问题,

是否可以将并行 gem 与 find_each 一起使用?我在他们的文档或在线示例中找不到任何这样做的内容。我可以采取另一种解决方案来同时迭代客户吗?

我建议您使用 Activerecord 的

find_in_batches
。您可以查询一批记录,然后使用 Parallel 迭代该批记录中的每个元素。例如,它可以是这样的

User.find_in_batches do |batch|
  Parallel.each(batch,in_processes: 8) do |user|
    ...
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.