1

Railsアプリケーションでcsvデータのmysqlへのインポートを実装しています。CSV.parseを使用して、csv ファイルを 1 行ずつ読み取り、データベースにインポートしました。この方法はうまくいきます。


しかし、Heroku サーバーにデプロイすると、各リクエストのタイムアウトは 30 秒です。csv ファイルを 30 秒以上インポートする場合。Heroku サーバーにエラーがあります: request timeout - H12。大きなcsvファイルをインポートする最良の方法を見つけるのを手伝ってくれる人はいますか? 現在、70 人のユーザーを含む小さな csv のみをインポートしています。500〜1000人のユーザーを含む大きなcsvをインポートしたい。コードは次のとおりです。

コントローラーのインポート:

CSV.foreach(params[:file].path, :headers => true) do |row|
  i = i + 1

  if i == 1
    @company = Company.find_or_create_by!(name: row[0])       
  end

  @users = User.find_by(email: row[1])

  if @users
    if @company.id == @users.employee.company_id
      render :status=> 401, :json => {:message=> "Error"}
      return
    else
      render :status=> 401, :json => {:message=> "Error"}
      return
    end
  else
    # User
    # # Generate password
    password = row[2]
    user = User.new(email: row[1])
    user.password = password.downcase
    user.normal_password = password.downcase
    user.skip_confirmation!
    user.save!

    obj = {
      'small'   => 'https://' + ENV['AWS_S3_BUCKET'] + '.s3.amazonaws.com/images/' + 'default-profile-pic_30x30.png',
      'medium'  => 'https://' + ENV['AWS_S3_BUCKET'] + '.s3.amazonaws.com/images/' + 'default-profile-pic_40x40.png'
    }

    employee = Employee.new(user_id: user.id)
    employee.update_attributes(name: row[3], job_title: row[5], gender: row[9], job_location: row[10], group_name: row[11], is_admin: to_bool(row[13]), 
                is_manager: to_bool(row[14]), is_reviewee: to_bool(row[6]), admin_target: row[7], admin_view_target: row[12], department: row[8], 
                company_id: @company.id, avatar: obj.to_json)
    employee.save!

  end
end

宝石「activerecord-import」または「fastercsv」を使用してみましたが、「activerecord-import」は機能しません。「fastercsv」は ruby​​ 2.0 および rails 4.0 では機能しません。

4

3 に答える 3

0

どうやらこれらの行は

if i == 1
  @company = Company.find_or_create_by!(name: row[0])       
end

@users = User.find_by(email: row[1])

30 秒の時間枠で多くの計算サイクルが必要です。

上記のコードを多少最適化できない場合は、 resqueまたはdelayed_jobを使用してルーチンを Heroku バックグラウンド プロセスに変換するか、ルーチンをn 個のリクエストに分割することをお勧めします。

お役に立てれば。

于 2013-10-21T03:33:46.967 に答える