0

ユーザーがCSVファイルから連絡先をインポートできるRails3.2アプリケーションを構築しています。CSVファイルのいずれかの連絡先行に検証エラーが含まれている場合、連絡先はインポートされず、エラーはCSVファイルでユーザーに表示されます。たとえば、連絡先のCSVに20行あり、4行と15行にエラーがある場合、連絡先はインポートされず、CSVの4行目と15行目の両方でエラーが表示されます。

私はこの機能を一度に各行を読み取り、 「 Contact.new 」を使用して配列に「ビルド」レコードを作成することで実行しました。エラーが存在しない場合は、配列を反復処理してすべての連絡先を保存します。そうでない場合は、エラーが存在することを示します。

行数が40に増えると、連絡先をインポートするのに約20分かかります。これは不良です。そのパフォーマンスを向上させる方法はありますか?

更新: このアプリをUnicornを使用してHerokuにデプロイしました。この40件の連絡先のCSVをインポートすると、30秒後にアプリがクラッシュしますが、すべての連絡先がインポートされます。以下は、アプリのクラッシュの原因となったログです。

2012-12-26T15:40:28+00:00 app[web.1]: E, [2012-12-26T15:40:27.233802 #2] ERROR -- : worker=0 PID:54 timeout (31s > 30s), killing
2012-12-26T15:40:29+00:00 app[web.1]: E, [2012-12-26T15:40:29.724725 #2] ERROR -- : reaped #<Process::Status: pid 54 SIGKILL (signal 9)> worker=0
2012-12-26T15:40:32+00:00 app[web.1]: Disconnected from ActiveRecord
2012-12-26T15:40:33+00:00 app[web.1]: Disconnected from Redis

これについて何か考えはありますか?

4

2 に答える 2

1

それはタイプミスですか、それともCSVファイルから40レコードをインポートするのに20分かかると本当に言いましたか?その場合は、設定に重大な問題があります。または、「連絡先」には、数百万のデータフィールドと検証などが必要です:/

herokuについては...herokuは30秒後にタイムアウトします。これは、Webリクエストの暴走を防ぐために行われます。彼らの公式の答えは、それをバックグラウンドの仕事に移し、そこで処理することです。

于 2012-12-26T18:26:50.343 に答える
0

連絡先をチャンクごとにインポートし、保存する前にすべてのレコードを検証できます。CSVファイルのチャンクおよび並列処理を可能にするsmarter_csvを見てください。

于 2013-02-20T18:40:43.747 に答える