我正在使用FasterCSV将上传的文件导入到模型中,并且它适用于小文件。但是,当我尝试导入大型数据集(21,000行)时,需要很长时间才能在实时服务器上获得浏览器超时。
这是我目前的工作代码:
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
我很乐意使用后台流程,但用户需要先查看已导入的行数,然后才能转移到系统的下一步。
所以,我认为我应该使用action chunking并且只读取少量行,设置计数器,然后用某种进度更新视图,然后使用前一个计数器再次运行该方法起点。
我似乎无法看到如何让FasterCSV只读取一定数量的行,并为起点设置偏移量。
有谁知道怎么做?或者有更好的方法来解决这个问题吗?
答案 0 :(得分:2)
答案 1 :(得分:0)
我宁愿创建一个准备好的查询,从文件加载一行并执行准备好的查询。不使用该模型,应该更快。
答案 2 :(得分:0)
如果你有数据库,为什么不通过Rake任务导入它?您的用户是否会导入这样的大型数据库?
如果您的用户将要导入此类大型数据库,则任务将无法执行。
FCSV.new可以采用IO.open可以选择的任何选项。您可以使用它来寻找特定字节。不幸的是,FCSV不容易停止或访问底层的IO对象,以找出你停在哪里。在文件中间恢复也会使标题行的使用变得复杂。
真的,我认为最佳解决方案是将您的CSV导入外包给drb,它会以控制器操作可以接收的方式定期报告其进度。然后经常在客户端上运行一些AJAX来调用该控制器操作。
我过去曾在BackgroundDRb取得过成功。它的安装和使用对我来说有点太详细了。还有其他一些插件和宝石可以通过谷歌搜索。
DRb警告大多数DRb解决方案都需要在您的服务器上运行其他守护程序进程。一些webhosts禁止在更基本的计划上。检查您的服务条款