2

我正在使用 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

我喜欢使用后台进程,但用户需要先查看导入了多少行,然后才能进入系统的下一步。

所以,我在想我应该使用动作分块并且只读取较少的行数,设置一个计数器,然后用某种进度更新视图,然后使用前一个计数器作为起点再次运行该方法。

我似乎看不到如何让 FasterCSV 仅读取一组行数,并为起点设置偏移量。

有谁知道如何做到这一点?或者有没有更好的方法来处理这个?

4

3 回答 3

2

尝试AR 导入

旧答案

您是否尝试过使用AR Extensions进行批量导入?当您将 1000 行插入 DB 时,您将获得令人印象深刻的性能改进。访问他们的网站了解更多详情。

于 2009-10-16T23:09:55.923 回答
0

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

于 2009-10-16T18:34:21.657 回答
0

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

如果您的用户要导入如此大的数据库,那么任务将不会执行。

FCSV.new 可以采用任何选项 IO.open 可以。您可以使用它来查找特定字节。不幸的是,FCSV 无法轻松停止或访问底层 IO 对象,以找出您停止的位置。在文件中间恢复也使标题行的使用变得复杂。

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

我过去曾在BackgroundDRb上取得过成功。它的安装和使用有点过于详细,我在这里无法重现。通过谷歌搜索,还有其他插件和 gems 可用。

DRb 警告大多数 DRb 解决方案需要在您的服务器上运行一个额外的守护进程。一些虚拟主机在更基本的计划中禁止这样做。检查您的服务条款

于 2009-10-16T18:51:47.837 回答