4

MSSQL 2008 の 400 万レコードの csv ファイルがあり、そのファイルを heroku の postgresql にインポートしたいと考えています。データを移行するスクリプトを用意しましたが、読み込みに時間がかかりすぎます。複数のファイルに分割しようとしましたが、やはり時間がかかりすぎます。

ローカル PC でインポートを実行してから、データを heroku にプッシュしようとしていますが、それほど高速ではありません。

アイデア、提案はありますか?

ありがとう

4

3 に答える 3

4

最近、3,000 万以上のレコードを含む大規模なインポートを行いました。

これが私たちがしたことです。

postgres のローカル コピーをセットアップしました。Rails アプリを実行しているので、これを開発データベースとして接続し、すべての移行を実行して、探していた適切なテーブル構造とインデックスを取得しました。

その後、Heroku にプッシュする MSSQL および MySQL 環境からデータをインポートしました。

テスト スクリプトを実行し、アプリをテストして、すべてのデータが有効であることを確認しました (日付、ブール フィールド、セットなどの列をチェックします)。

すべてのデータが設定された後、データに対してローカルの pgdump を実行しました。次のコマンドを使用しました。

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 が簡単に見つけられるように、プライベート amazon s3 バケットに配置します。

Heroku に複数のデータベースがある場合、または専用の postgres インスタンスを使用している場合は、コマンドラインからデータベースを設定してください。

heroku pg:promote HEROKU_POSTGRESQL_RED

HEROKU_POSTGRESQL_RED を自分のものに置き換えます。heroku pg:info コマンドで見つけることができます。これを行わないと、データベースが共有インスタンスにインポートされ、このプロセスをやり直す必要があります。

また、インポートを行う前に、pgbackups アドオンが有効になっていることを確認する必要があります。まだ行っていない場合は、今すぐ行ってください。

次のステップは Heroku のドキュメント ページです: https://devcenter.heroku.com/articles/pgbackups#importing_from_a_backup

heroku pgbackups:restore DATABASE 'http://s3.amazonaws.com/.....mydb.dump?authparameters'

その後、あなたは行く準備ができているはずです。お気軽にご質問ください。データ ダンプのサイズが 50 ギガを超えていたため、これを理解するのに少し時間がかかりました。

于 2012-05-29T20:50:09.160 に答える
1

このような大規模なインポート (私の場合は 1 ミル) があったとき、2 つのスクリプトを使用してそれを実行しました。

1 つは、インポートを 100 行のセクションに分割し、そのインポートを DelayedJob タスクにエンキューします。

2 つ目は、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週間ほどかかりましたが、1回のインポートの速度にすべて依存しています(私の場合は、インデックスを作成していたため、追加の行のインポートが非常に遅くなりました)

注: ワーカーのコストは 0.05 USD/時間です。つまり、1 人の労働者の 1 日 = $1.20 のようになります。

于 2012-05-25T14:36:18.990 に答える
0

それをローカルの PostgreSQL インストールにロードしてから、ダンプを作成し、結果を圧縮して heroku にアップロードすることができます。私は Heroku を使用していないので、CLI PostgreSQL ツールを使用しているかどうかはわかりません。使用している場合は、同様の方法でダンプと復元を行う必要があります。

バックアップと復元の詳細については、 PostgreSQLのドキュメントを確認してください。

于 2012-05-25T14:28:50.427 に答える