我有一个来自MSSQL 2008的CSV文件,其中包含400万条记录,我想将该文件导入到Heroku上的PostgreSQL中。我已经准备好了迁移数据的脚本,但是加载时间太长了,我尝试将其拆分为多个文件,但时间再次过长。
我正在尝试在本地计算机上进行导入,然后将数据推送到Heroku,但速度还是不够快。
有什么想法、建议吗?
谢谢。
我正在尝试在本地计算机上进行导入,然后将数据推送到Heroku,但速度还是不够快。
有什么想法、建议吗?
谢谢。
PGPASSWORD=your_db_password_here pg_dump -Fc --no-acl --no-owner -h localhost -U your_db_user_here your_db_name_here > mydb.dump
heroku pg:promote HEROKU_POSTGRESQL_RED
heroku pgbackups:restore DATABASE 'http://s3.amazonaws.com/.....mydb.dump?authparameters'
之后你应该准备就绪了。如有问题,请随时提问。这花费我们一些时间来弄清楚,因为我们的数据转储大小超过50GB。
当我有一个像这样的大型导入(我的是100万行)时,我使用了两个脚本来完成它。
一个将导入拆分为100行的部分,并将其导入排队到DelayedJob任务中。
第二个是运行DelayedJob的导入脚本。
这是批处理程序:
def Importer.create_import_jobs(filename)
batch_size = 100
puts "reading csv"
rows = []
batch_counter = 1
CSV.foreach(filename, :headers => true) do |row|
rows << row
if rows.size == batch_size
puts "making batch #{batch_counter}"
Delayed::Job.enqueue ImportJob.new(rows)
rows = []
batch_counter += 1
end
end
end
这里是工作者
class ImportJob < Struct.new(:rows)
def perform
rows.each do |row|
# do you import command here. if you want to go through ActiveRecord it would be like Employee.create(:name => row[1], :phone => row[2])
end
end
def error(job, exception)
Airbrake.notify(exception) # for my debugging / exception purposes, not necessary
end
end
然后您可以运行第一个脚本来排队作业。然后在Heroku管理面板中启动工作程序以处理所有批次。我的花了一周的时间,但这完全取决于1个导入的速度(我的正在构建索引,因此每增加一行导入速度就会变慢)
注意:工作程序费用为$0.05 /小时。因此,一个工作程序的一天= $1.20。