Rails Rake任务CSV导入很慢

时间:2014-03-27 03:04:07

标签: postgresql ruby-on-rails-4 rake-task

我正在通过rake任务导入csv文件(前几天根据我的问题here)。

namespace :csvimport do

  desc "Import Products CSV Data."
  task :products => :environment do

    ActiveRecord::Migration.drop_table products

    require 'csv'
    csv_file_path = '/home/jay/workspace/db/import_tables/products.csv'
    CSV.foreach(csv_file_path) do |row|
      p = Product.create!({
          :product_id => row[0],
          :product_name => row[1],
        }
      )
    end
  end
end

这适用于小文件大小(比如10000行)。但是当我尝试使用更大的文件超过一百万时,这需要很长时间。我也没有得到关于这个过程正在发生的反馈。如果我进入pgAdmin3并使用SQL SELECT count(*) FROM sales;,我可以看到它每秒上升10或20行。

有没有人对更好的方法有任何建议?我可以直接通过pgAdmin SQL导入数据,速度非常快(几分钟),但我想构建一个解决方案,这样当我开始制作时,我可以通过管理界面来实现。

说到这一点,一旦我投入生产,我将尝试仅在将其带入轨道时从我们的旧系统中导入新数据。

另外,我怎样才能杀死现有的rake任务?更好的方式就是' x'离开终端。

1 个答案:

答案 0 :(得分:2)

使用COPY

Ruby Pg gem supports this with the copy_data method of PG::Connection

宝石附带了如何使用它的例子。

要了解有关提高插入率的更多信息,请参阅:How to speed up insertion performance in PostgreSQL。特别是,请参阅将工作批量处理为事务的建议。