我有一個包含數千行的excel文件。在我的情況下,我不能使用批量插入,因爲對於每一行我都應該創建幾個關聯。現在,所有的過程需要20多行,超過1小時,這是地獄。解決這個問題的最好方法是什麼?將巨大的Excel文件導入到Rails應用程序中
我正在使用電子表格寶石。
我有一個包含數千行的excel文件。在我的情況下,我不能使用批量插入,因爲對於每一行我都應該創建幾個關聯。現在,所有的過程需要20多行,超過1小時,這是地獄。解決這個問題的最好方法是什麼?將巨大的Excel文件導入到Rails應用程序中
我正在使用電子表格寶石。
這類似於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
因爲你不必每次都做對數據庫進行搜索,這是要快得多。它還應該允許您使用批量插入(假設您可以保證在加載過程中不會刪除或修改相關模型)。
好的答案,我在PHP/MySQL的工作中遇到了這個問題,儘管在一個不是MVC的系統中。我一直想知道如何避免N + 1一段時間。值得添加的答案是:not_found是ActiveRecord :: RecordNotFound的一個符號,所以如果一個非有效的密鑰傳遞給哈希,那麼哈希將返回而不是零。我瞭解哈希如何工作,但必須查找:not_found => ActiveRecord :: RecordNotFound最近纔回到Rails。 – Axiombadger 2016-04-08 20:03:06
您是否考慮過排隊機制,例如Resque,Delayed Job,Simple Queue或Sidekiq? – 2013-05-07 23:49:45
這是一個終極解決方案。根據要求加載更多更喜歡。 – Meliborn 2013-05-07 23:53:01