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