使用Rails 3.2从CSV导入大量联系人

时间:2012-12-26 14:35:07

标签: csv ruby-on-rails-3.2

我正在构建rails 3.2应用程序,允许用户从CSV文件导入联系人。如果CSV文件中的任何联系人行包含验证错误,则不会导入任何联系人,并且会在CSV文件中向用户显示错误。例如,如果联系人CSV有20行,其中4行和15行有错误,则不会导入任何联系人,并且将为CSV的第4行和第15行显示错误。

我通过一次读取每一行并使用“ Contact.new ”在数组中的“构建”记录来完成此功能。如果不存在错误,我通过迭代数组保存所有联系人,否则显示错误。

如果行数增加到40,则导入错误的联系人大约需要20分钟。有没有办法提高它的表现?

更新 我用独角兽在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

对此有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这是一个错字还是你真的说从CSV文件导入40条记录需要20分钟?如果是这种情况,您的设置会出现严重问题。或者您的“联系人”必须拥有大量数据字段和验证或其他内容:/

至于heroku ...... heroku将在30秒后超时。这样做是为了防止失控的Web请求。他们的正式答案是将其转移到后台工作并在那里处理。

答案 1 :(得分:0)

您可以按块导入联系人并在保存之前验证每条记录。 看一下smarter_csv,它允许对CSV文件进行块和并行处理。

相关问题