2017-08-16 15 views
1

私はHerokuを使用して配備しているレールアプリを構築しています。大きなcsvファイル(5000行以上)をインポートして処理できる必要があります。ルビーのcsvパーサに組み込まれて使用してコントローラにそれをやって非常に大きなcsvファイルをレールでインポートして処理するには

は時間に

を30秒以上かかり、Herokuのダイナモを引き起こし、私はdelayed_jobでそれを処理し、データベースにcsvファイルを置くことを考えていたが、このましたメソッドはわずか4200行を超えて制限します。

デシベルは

にこのユースケースのための任意のアイデアをそれを処理することができるはずですので、私は、ファイルを含む列のためのMySQLとLONGTEXTを使用していますか?

+1

あなたは、いくつかのファイルにCSVを分割することができ、単純にワーカーを使用してCSVを実際に解析してデータを保存し、「あなたのCSVが解析されているときに数分で戻ってくる」というユーザーに直接応答することができます。 – MrYoshiji

+0

このファイルを作業者に送信しようとすると、遅延ジョブテーブルには大きすぎるため、アクティブなレコードエラーが発生する – user3277176

+0

私のプロセスは基本的にコントローラにファイルを保存させ、 /労働者。ファイルを1行ずつ、またはバッチで解析すると、アクティブなレコードエラーが発生しません – whodini9

答えて

2
  • 速くcsvファイルをインポートするには、私の提案は、宝石smarter_csvを使用している自分のサイトから述べたように、あなたはそれらのウェブサイトtilo/smarter_csv
  • からCEKすることができます:> smarter_csvは、Array(SなどのCSVファイルのよりスマートな輸入のためにRubyの逸品です)ハッシュの、私はこの宝石を使用しresque
  • 以下

組み合わせるresque又はSidekiq

  • とMongoidまたはActiveRecordのとの直接処理、並列処理に適したファイル

    をインポートするサンプルコードであります
    n = SmarterCSV.process(params[:file].path) do |chunk| 
        Resque.enqueue(ImportDataMethod, chunk) 
        end 
    

    それはファイルを読んだ後、resqueして、バックグラウンドでそれをインポートするデータレコードを渡された(あなたはあなたの上にレール4.2を使用している場合は、レールアクティブなジョブに組み合わせることができます)

  • 関連する問題