Ruby on rails 在Rails中批量导入CSV行吗?
我正在使用FasterCSV将上传的文件导入到模型中,它对小文件非常有效。但是,当我尝试导入一个大数据集(21000行)时,需要花费很长时间,并且在live server上出现浏览器超时 这是我当前的工作代码: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')
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更新了答案。谢谢你的链接。