【问题标题】:Store large matrix in Rails app在 Rails 应用程序中存储大型矩阵
【发布时间】:2013-02-08 15:59:33
【问题描述】:

在我的 Ruby On Rails 应用程序中,我必须为每个文档存储(相对)大约 300x300 个元素(浮点值,大部分不同)的大型矩阵。在每次检索文档时,都必须加载完整的矩阵以进行自定义计算。矩阵也经常更新(因此写入性能和内存缓存也是一个问题)。

存储此类矩阵的好方法是什么(性能方面)?我想到的一些替代方案:

  1. 包含rowcolumnvalue 列的表。但我猜想在每个请求上获取和存储整个矩阵(大约 90000 个单元格)并不是一个好主意(一些内存缓存会有所帮助)。
  2. 将序列化的矩阵存储在文本字段/列中。从性能的角度来看,您对它与 1. 的比较有何想法?
  3. 使用一些文档数据库(例如 Mongo)并将整个矩阵存储在文档的一个字段中(不确定与 2. 相比的好处在哪里)。

【问题讨论】:

  • 如何与 R 或 Matlab 等人进行矩阵工作并让他们完成繁重的工作?
  • 这里回答了一些类似的问题,即使这不是稀疏数据,所以并不是所有的都是相关的:stackoverflow.com/a/2599384/178651 - 我认为的诀窍是首先考虑存储/检索它的方式有效地进入/来自数据库,然后您可以确定需要在 Rails 中进行多少解析、比较等。
  • 鉴于这是满足您需求的独特方案,我建议您尝试一些看起来最好的选项。我的第一个想法是将其存储为一个大 blob(想想 CSV)(选项 #2)。但是,我从来不需要存储任何你需要的东西,所以很难预测。我不会仅仅为此使用 MongoDB。您的描述听起来不像您需要数据库的其他功能。

标签: ruby-on-rails mongodb rails-activerecord large-data


【解决方案1】:

任何类型的 ACID 兼容存储的按需写入和检索性能都将成为问题。作为最佳实践,我建议采用缓存重策略,将矩阵保存在内存中,如果您需要跨多个服务器,也许可以使用 memcache。然后,您可以将读取和写入从您的请求周期中取出,随后您不必太在意写入性能,并且可以使用任何东西(例如 MySQL 中的文本字段或其他任何东西)。

为此,我建议编写一个执行以下操作的自定义矩阵类:

  • 检查缓存以获取其数据的副本,如果不可用,则从数据库加载并填充缓存。
  • 当缓存副本更新时异步写入数据库。
  • 为您的代码提供优化的数据接口

【讨论】:

    猜你喜欢
    • 2019-11-04
    • 2014-07-06
    • 2012-02-21
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2018-08-12
    • 1970-01-01
    相关资源
    最近更新 更多