Rails (rake) 数据导入并发

Rails (rake) Data Import Concurrency

我正在尝试从基于 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)。

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

对于这个问题,

is it possible to use the parallel gem with find_each? I cannot find anything in their documentation or examples online doing such. Is there another solution I can do to for iterating over the Customers concurrently?

我建议您使用 Activerecord 的 find_in_batches。您可以查询一批记录,然后使用 Parallel 遍历批处理中的每个元素。例如,它可以是

User.find_in_batches do |batch|
  Parallel.each(batch,in_processes: 8) do |user|
    ...
  end
end