我正在通过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'离开终端。
答案 0 :(得分:2)
使用COPY
。
Ruby Pg
gem supports this with the copy_data
method of PG::Connection
。
宝石附带了如何使用它的例子。
要了解有关提高插入率的更多信息,请参阅:How to speed up insertion performance in PostgreSQL。特别是,请参阅将工作批量处理为事务的建议。