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