Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.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
Ruby on rails 在Rails中批量导入CSV行吗?_Ruby On Rails_Ruby_Fastercsv - Fatal编程技术网

Ruby on rails 在Rails中批量导入CSV行吗?

Ruby on rails 在Rails中批量导入CSV行吗?,ruby-on-rails,ruby,fastercsv,Ruby On Rails,Ruby,Fastercsv,我正在使用FasterCSV将上传的文件导入到模型中,它对小文件非常有效。但是,当我尝试导入一个大数据集(21000行)时,需要花费很长时间,并且在live server上出现浏览器超时 这是我当前的工作代码: logcount=0 Attendee.transaction do FCSV.new(file, :headers => true).each do |row| row[1] = Date.strptime(row[1], '%m/%d/%Y')

我正在使用FasterCSV将上传的文件导入到模型中,它对小文件非常有效。但是,当我尝试导入一个大数据集(21000行)时,需要花费很长时间,并且在live server上出现浏览器超时

这是我当前的工作代码:

  logcount=0
  Attendee.transaction do
    FCSV.new(file, :headers => true).each do |row|
      row[1] = Date.strptime(row[1], '%m/%d/%Y')
      record = @event.attendees.new(:union_id => row[0], :dob => row[1], :gender => row[2])
      if record.save
        logcount += 1
      end
    end
  end
我希望使用后台进程,但用户需要查看导入了多少行,然后才能进入系统的下一步

因此,我想我应该使用并且只读取少量的行,设置一个计数器,然后用某种进度更新视图,然后使用前面的计数器作为起点再次运行该方法

我似乎看不出如何让FasterCSV只读取一定数量的行,并为起点设置偏移量


有人知道怎么做吗?还是有更好的方法来处理这个问题?

我宁愿创建一个准备好的查询,从文件中加载一行,然后执行准备好的查询。如果不使用任何模型,应该更快。

如果您有数据库,为什么不通过Rake任务导入它?您的用户会导入如此大的数据库吗

如果您的用户要导入如此大的数据库,那么一项任务就不行了

FCSV.new可以接受任何选项IO.open can。您可以使用它来查找特定字节。不幸的是,FCSV不便于停止或访问底层IO对象,从而找出停止的位置。在文件中间恢复也会使头行的使用复杂化。

事实上,我认为最佳的解决方案是将CSV导入外包给drb,drb定期报告其进度,以便于控制器操作。然后,在客户端上运行一些AJAX时,每隔一段时间调用一次控制器操作

我过去在这方面很成功。它的安装和使用有点过于详细,我无法在这里复制。通过谷歌搜索,还有其他插件和gem可用

DRb警告大多数DRb解决方案需要在服务器上运行额外的守护进程。一些网络主机在更基本的计划中禁止这样做。检查您的TOS,然后再试一次

旧答案

您是否尝试过使用散装进口? 当您向DB插入1000行时,您将获得令人印象深刻的性能改进。
更多详情,请访问他们的网站。

你能给我举个例子说明你的意思吗?您认为它是否足够快,不需要向浏览器发送更新?不需要导入21000条记录。对于查看此死链接的任何人:此解决方案不再适用于Rails 3及更高版本。现在,同一组开发人员在:@tommyalvarez更新了答案。谢谢你的链接。