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

0

準備されたクエリを作成し、ファイルから行をロードして、準備されたクエリを実行したいと思います。モデルを使用しなければ、より速くなるはずです。

于 2009-10-16T18:34:21.657 に答える
0

データベースがある場合は、Rake タスクを使用してインポートしてみませんか? ユーザーはそのような大規模なデータベースをインポートする予定ですか?

ユーザーがそのような大規模なデータベースをインポートしようとしている場合、タスクは実行できません。

FCSV.new は、IO.open が使用できる任意のオプションを使用できます。それを使用して、特定のバイトをシークできます。残念ながら、FCSV では、基になる IO オブジェクトを停止またはアクセスして、停止した場所を見つけることは簡単ではありません。ファイルの途中で再開すると、ヘッダー行の使用も複雑になります。

本当に、最適な解決策は、CSV インポートを drb に外部委託することだと思います。drb は、コントローラーのアクションが取得できる方法で進行状況を定期的に報告します。次に、クライアントで実行されている AJAX を使用して、そのコントローラー アクションを頻繁に呼び出します。

過去にBackgroundDRbで成功しました。インストールと使用は、ここで再現するには少し詳細すぎます。少しグーグルで検索すると、他にもプラグインや宝石が利用できます。

DRb の警告ほとんどの DRb ソリューションでは、サーバー上で実行される追加のデーモン プロセスが必要です。一部のウェブホストは、より基本的なプランでこれを禁止しています. TOS を確認する

于 2009-10-16T18:51:47.837 に答える