将巨大的 excel 文件导入 Rails 应用程序
Posted
技术标签:
【中文标题】将巨大的 excel 文件导入 Rails 应用程序【英文标题】:Importing huge excel file to Rails application 【发布时间】:2013-05-07 23:43:48 【问题描述】:我有一个包含数千行的 excel 文件。就我而言,我不能使用批量插入,因为对于每一行我应该创建一些关联。现在,20k 行的所有过程都需要 1 个多小时,这简直是地狱。解决此问题的最佳方法是什么?
我正在使用 电子表格 gem。
【问题讨论】:
你考虑过Resque、Delayed Job、Simple Queue、Sidekiq等排队机制吗? 这是一个终极解决方案。更喜欢按需加载。 【参考方案1】:这类似于 Rails 喜欢遇到的臭名昭著的“1+N”查询情况。我有类似的情况(导入具有多个关联的 20k+ 行的文件)。我优化此过程的方式是为关联预加载哈希。因此,例如,如果您的导入数据中有一个 AssociatedModel
,其中包含一个 lookup_column
,您将首先构建一个哈希:
associated_model_hash = Hash.new(:not_found)
AssociatedModel.each do |item|
associated_model_hash[item.lookup_column] = item
end
这提供了对象的散列。您可以重复尽可能多的关联。在您的导入循环中:
associated_model = associated_model_hash[row[:lookup_column]]
new_item.associated_model_id = associated_model.id
因为您不必每次都在数据库上进行搜索,所以速度要快得多。它还应该允许您使用批量插入(假设您可以保证关联的模型在加载过程中不会被删除或以错误的方式修改)。
【讨论】:
很好的答案,尽管在不是 MVC 的系统中,我在 php/mysql 中经常遇到这个问题。我一直想知道如何避免 N+1 一段时间。可能值得添加的答案是:not_found 是 ActiveRecord::RecordNotFound 的符号,因此如果将无效密钥传递给哈希,哈希将返回而不是 nil。我了解哈希是如何工作的,但必须查找 :not_found => ActiveRecord::RecordNotFound 最近才回到 Rails。以上是关于将巨大的 excel 文件导入 Rails 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
将 excel、openoffice 和 ms office 2007 数据导入到 rails 中的 db
将空白 Excel 单元格保存到 Rails Postgres 数据库
如何编写 Rake 任务以将数据导入 Rails 应用程序?