如何使用 Rails 最好地导入和处理非常大的 csv 文件

use*_*176 2 ruby mysql ruby-on-rails heroku delayed-job

我正在构建一个使用 Heroku 部署的 Rails 应用程序,我需要能够导入和处理大型 csv 文件(5000 多行)。

使用内置 ruby​​ csv 解析器在控制器中执行此操作需要 30 秒以上,并导致 Heroku dyno 超时

我正在考虑将 csv 放入数据库,然后使用elasto_job对其进行处理,但这种方法限制在 4200 多行。

我正在使用 mysql 和 longtext 作为包含文件的列,因此数据库应该能够处理它

对于这个用例有什么想法吗?

wid*_*ayd 5

  • 为了更快地导入 csv,我的建议是使用 gem smarter_csv,您可以从他们的网站tilo/smarter_csv中 cek
  • 如其网站所述: > smarter_csv 是一个 Ruby Gem,用于更智能地将 CSV 文件导入为哈希数组,适合使用 Mongoid 或 ActiveRecord 直接处理,以及使用 Resque 或 Sidekiq 并行处理
  • 我使用这个 gem 并与 resque 结合使用

下面是导入文件的示例代码

  n = SmarterCSV.process(params[:file].path) do |chunk|
    Resque.enqueue(ImportDataMethod, chunk)
  end
Run Code Online (Sandbox Code Playgroud)

读取文件后,将数据记录传递给 resque,然后在后台导入(如果您使用上面的 Rails 4.2,则可以与 Rails Active Job 结合使用)