我目前正在开发一个 ruby on rails 项目,我每天都会从每天发布有价值数据但不会长时间存储它们的网站上抓取和保存数据。我正在抓取这些并将它们保存到我们的数据库中以制作时间序列数据集。我们拥有近75 项资产,每项资产都有20 年的历史数据平均而言。之前的算法有一个错误,因为我们所有的历史数据现在都不正确。我发现了问题并重新编写了目前运行良好的算法。我尝试修改数据库以获取前 1 年的历史数据(针对 1 项资产),并且运行良好。现在,事实是,当我在本地更新数据库时,对于具有 1 年历史数据的 1 项资产大约需要 10 分钟。如果我在 heroku 上做同样的事情,大约需要 37 分钟,这似乎很长。由于我们有 75 个资产,每个资产都有 20 年的历史数据,所以我假设,它应该花费75*20*37 = 55,550 分钟 = 925 小时!!!这对我来说似乎不可行。同样,这些数据对我们来说非常有价值,因此我们需要为我们拥有的所有历史数据更新我们的数据库。我在本地和 heroku 上使用 PostgreSQL 数据库。我的怀疑是,Rails 活动记录不是为做这种事情而设计的,而且它也非常昂贵。在这种情况下我该怎么办?我的问题的最佳解决方案应该是什么?我怎样才能使这项任务更快地完全满足我的目的?任何形式的建议/想法都非常感谢。
2 回答
您应该考虑几件事。由于上面的评论中提到的mu 太短了,因此摆脱 Rails 提供的任何开销可能会有所帮助。您可以通过使用 Sequel gem 编写一个 rake 任务来执行此操作,该任务以更少的开销访问您的数据库。Sequel提供了一个相当简单的 API,它可以帮助您编写高效的查询,而无需 SQL 的不直观语法和 ActiveRecord 的开销。
我对 Heroku 的内部结构不够了解,但是要考虑的另一件事是运行您的代码的 heroku 实例是否能够足够快地完成您的 rake 任务中的繁重工作。另一位用户可能会评论您是否能够从另一台机器上运行 rake 任务,或者甚至只是通过启动您的 heroku 实例上的资源来获得收益
我已经遇到过这种问题,我使用Sequel来解决它。它可以让您在 Ruby 中编写翻译算法,但无需使用繁重的 ActiveRecord 功能。
如果用 Sequel 编写的算法仍然需要很长时间,您将不得不直接编写 SQL,因为 @mu 像建议的那样太衬衫了。将 Sequel 代码转换为行 SQL 可能比 ActiveRecord 代码容易得多。
最后,您将运行的每个脚本都将在一个 Heroku dyno 上,它们的容量有限,您最好在本地运行它并将固定的数据库上传到 Heroku,而不是直接在 Heroku 上运行脚本。也许还有一些heroku插件可以为您提供更多资源。