Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用rails最好地导入和处理非常大的csv文件_Mysql_Ruby On Rails_Ruby_Heroku_Delayed Job - Fatal编程技术网

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

Mysql 如何使用rails最好地导入和处理非常大的csv文件,mysql,ruby-on-rails,ruby,heroku,delayed-job,Mysql,Ruby On Rails,Ruby,Heroku,Delayed Job,我正在构建一个与Heroku一起部署的rails应用程序,我需要能够导入和处理大型csv文件(5000多行) 使用内置ruby csv解析器在控制器中执行此操作需要30秒以上的时间,并导致Heroku dyno超时 我曾考虑将csv放入数据库,然后用延迟的_作业处理它,但这种方法仅限于4200多行 我使用mysql和longtext作为包含文件的列,因此db应该能够处理它 对这个用例有什么想法吗? 为了更快地导入csv,我的建议是使用gem smarter_csv,您可以从他们的网站cek 正如

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

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

我曾考虑将csv放入数据库,然后用延迟的_作业处理它,但这种方法仅限于4200多行

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

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

  • 为了更快地导入csv,我的建议是使用gem smarter_csv,您可以从他们的网站cek
  • 正如他们在网站上所说:>smarter_csv是一个Ruby Gem,用于以哈希数组形式更智能地导入csv文件,适用于使用Mongoid或ActiveRecord直接处理,以及使用Resque或Sidekiq并行处理
  • 我用这个宝石,再加上resque
下面是导入文件的示例代码

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

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

您可以将CSV拆分为多个文件,或者只需使用辅助程序实际解析CSV并存储数据,然后直接响应需要的用户“正在分析您的CSV,请几分钟后回来“。尝试过,将文件发送到工作进程会导致活动记录错误,因为它对于延迟的作业表来说太大。我的流程基本上是让控制器保存文件,并执行任何可能在后台进程/工作进程中涉及大量文件的操作。如果逐行或批处理解析文件,则不应导致活动记录错误