【问题标题】:How to best import and process very large csv files with rails如何使用 rails 最好地导入和处理非常大的 csv 文件
【发布时间】:2018-01-24 22:00:36
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您可以将 CSV 拆分为多个文件,或者简单地使用 Worker 来实际解析 CSV 并存储数据并直接回复用户“您的 CSV 正在被解析,几分钟后回来"。
  • 试过了,将文件发送给工作人员会导致活动记录错误,因为它对于延迟的作业表来说太大了
  • 我的过程基本上是让控制器保存文件并在后台进程/工作人员中执行任何可能涉及大量文件的操作。如果您逐行或批量解析文件,则不会导致活动记录错误

标签: mysql ruby-on-rails ruby heroku delayed-job


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

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

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

读取文件后,将数据记录传递给resque,然后在后台导入(如果你使用上面的rails 4.2,你可以结合rails active job)

【讨论】:

    猜你喜欢
    • 2013-05-17
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    相关资源
    最近更新 更多