0

我正在构建一个允许用户从 CSV 文件导入联系人的 rails 3.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

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

于 2013-02-20T18:40:43.747 回答