0

200k レコードを 3 つの異なるテーブルに挿入しようとしています。CSV ファイルを解析してこれらのレコードを挿入しようとすると、Ruby によってシステム全体がロックされます。これが私のコードです:

def upload_country
  @upload = Upload.new(:upload => params[:upload])
  if  @upload.save
  csv = CSV.parse(csv_text, :headers => true)

  csv.each_with_index do |row, index|
    unless row["name"].blank? or row["country_code"].blank? or row["destination"].blank? or row["code"].blank?
      @country = Country.new(:name => row["name"].gsub(/\s+/, " ").strip, :country_code => row["country_code"].gsub(/\s+/, " ").strip, :user_id => current_user.id, :subscriber_id => get_subscriber_id)
      @country.save

      if row["country_code"] == "1"
        p = @country.country_code.to_s+@destination.name+row["code"].gsub(/\s+/, " ").strip
      else
        p = @country.country_code.to_s+row["code"].gsub(/\s+/, " ").strip
      end

      @code = DestinationCode.create(:code => p, :country_destination_id => 1, :user_id => current_user.id)
    end
  end

  @upload.destroy
  @countries = Country.find_all_by_subscriber_id(get_subscriber_id)
  render :partial => '/mycarriers/carrier_country', :layout => false
end
4

2 に答える 2

1

実行時間の長いリクエストがある場合、実行中の Rails インスタンスが 1 つしかない場合、その時点で他のユーザーがアプリケーションにアクセスできないことを意味します。

delayed_job gemバックグラウンドで長い処理タスクを実行するために使用することをお勧めします。response 202 (Accepted)コントローラー側では、ジョブをブラウザーにエンキューする必要があります。クライアント側では、ジョブが終了したかどうかにかかわらず、定期的にサーバーにリクエストを送信する必要があります。次に、それに応じて UI を更新します。

例として、 slideshare.netを取り上げます。ユーザーがアップロードを完了すると、slideshare は新しいページにリダイレクトし、プレゼンテーション ファイルを変換している間、定期的に UI を更新します。

別の解決策は、rake スクリプトをバックグラウンドで実行することです。Railscasts のこのエピソードをご覧ください。

于 2012-05-28T16:09:28.070 に答える