ruby-on-rails - 在数据库中存储数千万条记录的最佳选择是什么?
问题描述
我正在为某位交易员工作,他想建立一个相对庞大的股票报价档案以供进一步分析。我们可以访问信息提供者,并且数据始终具有相同的结构:股票代码名称、时间戳和 OHLC,因此它适合关系数据库方法。到目前为止,我使用 Ruby on Rails(Ruby 2.6、Rails 6.0)和 PostgreSQL 制作了一个工作原型。它可以非常快地从提供者那里获取数据,但是将数百万条记录存储到数据库中非常慢。我从 ActiveRecord 样式切换到纯 SQL,它使它快了 3 倍,但是存储少量所需数据仍然是一个非常长的过程。所以我需要以某种方式提高原型的性能,但不知道该怎么做。我当然可以使用 Redis 之类的东西,但无论如何我都需要将数据存储到持久存储中。
解决方案
这个问题可能会被标记,但无论如何我都会给你一个答案:
ActiveRecord 不一定很慢。ActiveModel 很慢。
ActiveModel 将您的结果集和数据库类型映射到对 ruby 友好的对象,并将您的数据(字符串-y 事物)转换为数据库类型以进行插入/更新。
如果您正在渲染 JSON,请确保您使用的是 C 渲染器 OJ 或类似的:https ://github.com/ohler55/oj - 它对更大的数据集和响应有很大的不同。
如果您对作为可以循环遍历的哈希的结果集感到满意,则可以避免使用以下命令访问 ActiveModel connection#exec_query
:
stocks_query = Stock.all
results = Stock.connection.exec_query(stocks_query.to_sql).to_a
results.each do |result|
puts result
end
如果您要插入数百万行,甚至更新数百万行,您可能应该使用正确的工具来完成这项工作:原始 SQL。但这变得笨拙,而且你喜欢 ruby,所以你可以使用类似https://github.com/zdennis/activerecord-import的东西,它可以让你编写 ruby,它会处理剩下的事情。
几千万条记录并不多。PostgreSQL 可能是您最好的选择,而不会引入大量不必要的复杂性。您只需要知道使用 Rails 与数据库层通信的瓶颈,以及如何解决这些瓶颈。确保您的数据库也被正确索引。如果您不确定,https://github.com/plentz/lol_dba是一个不错的起点。
推荐阅读
- r - 如何创建此序列?
- python - 对象的随机名称生成器
- pandas - 需要使用 Alteryx 或 Pandas 从 excel 列中提取特定文本
- ios - 检测有效的网址
- proof - 将 Bits8 转换为 `Subset Nat (`LT` 256)`
- c# - Xamarin Forms 使用 SQL 编辑项目
- machine-learning - 对 CNN 中跳过层的实现感到困惑
- angular - 角度单选按钮标签不显示正确
- python - 我在 selenium 中有这个错误:(消息:过时的元素引用:元素未附加到页面文档)
- flutter - 我遇到了这个问题->找不到 androidx.appcompat:appcompat:26.1.0