2009-10-16 79 views
2

我正在使用FasterCSV将上传的文件导入到模型中,它对于小文件非常适用。但是,当我尝试导入一个大型数据集(21,000行)时,它需要很长时间,并且我在实时服务器上看到了浏览器超时。在Rails中批量导入CSV?

这是我目前的工作代码:

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只读取一定数量的行,并且还为起始点设置偏移量。

有谁知道如何做到这一点?还是有更好的方法来处理这个问题?

回答

2

您是否尝试过使用AR Extensions进行批量导入? 将数千行的行插入数据库时​​,您会获得令人印象深刻的性能改进。 访问他们的website了解更多详情。

+0

对于任何人在看这个死链接:https://web.archive.org/web/20080729041651/http://www.continuousthinking.com/tags/arext – MaicolBen 2017-04-26 13:29:40

0

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

+0

你能举个例子说明你的意思吗?你觉得它不会需要发送更新到浏览器足够快吗? – Les 2009-10-16 18:44:46

+0

不能输入21000条记录。 – EmFi 2009-10-16 18:53:52

0

如果你有数据库,为什么不通过Rake Task导入它?你的用户是否会导入这样的大型数据库?

如果您的用户将要导入这样的大型数据库,任务将不会执行。

FCSV.new可以采用IO.open的任何选项。你可以使用它来寻找一个特定的字节。不幸的是,FCSV并不容易停止或访问底层的IO对象,找出你停下来的地方。在文件中间恢复也会使标题行复杂化。

真的,我认为最佳的解决方案是将您的CSV导入外包给drb,定期以控制器动作可以接受的方式报告它的进度。然后在客户端上运行一些AJAX,每隔一段时间调用一次该控制器的动作。

我已经在BackgroundDRb过去取得了成功。它的安装和使用有点过于详细,我不能在这里重现。还有其他一些插件和宝石,可以使用一些Google搜索。

DRb警告大多数DRb解决方案都需要在服务器上运行附加的守护进程。一些网络主机禁止更多基本计划。检查您的TOS