【问题标题】:Data structure for large set of stepwise/incremental data and method to store it大量逐步/增量数据的数据结构及其存储方法
【发布时间】:2014-08-23 16:58:53
【问题描述】:

我不知道我是否不知道正确的术语,或者我正在寻找的内容是否不是一个常见的结构,所以请耐心等待我尝试描述我正在寻找的内容。

现在我有一个排序集。它通过简单的修改随时间而变化。插入、删除 (k,v) 对,或者特定键的值可能发生变化。

不会或永远不会对多个键执行任何操作。

我需要一种方法来存储数据集的每个增量版本并将其映射到某个时间点。我需要快速访问其中的任何部分,并能够生成当时存在的准确排序集,以及它在一段时间内的变化情况。

在每个突变之后存储实际的排序集是不可行的,因为它大约有 10kb 的数据,平均每秒大约有 2-3 个突变。这是一个个人项目,因此每天每组(乘以 10-20 组)写入 2.5 GB 数据的成本太高了。

现在我想出了一个解决方案 - 我的问题是,我想出的解决方案有一个术语吗?有更好的方法吗?

如果我有一个初始数据集Orders,则下一次数据迭代可以写为Orders + (K,V),然后我不会将整个数据集存储两次,而是将实际数据集存储一次,然后再存储第二次作为参考 + 突变。

然后,如果我想访问 Orders[n],我将迭代 Orders[0] -> Order[n] 应用突变,然后生成及时存在的集合。

然而,这有一个大问题。我需要能够快速访问任何范围的数据 - 每天大约 250,000 次迭代 * 几个月或几年 - 所以当 n 很大时从 0 -> n 计算集合是不切实际的。这里明显的解决方案是在某个时间间隔缓存结果集,而不是递归地计算给定的数据点一直到 Orders[0] 它只需要计算回Orders[1,500,000] 以找到存在于的集合Orders[1,500,100].

如果我认为这是构建数据的好方法,我应该多久缓存一次结果?

这样的东西存在吗?在我的研究中,很多消息来源说使用链表或二叉树。我不需要树,因为我的数据是 100% 连续的,而不是分支的。因此,如果我使用链表,我的困惑在于实际存储数据。这就是我完全陷入困境的地方。存储它的最佳数据库和数据库模式是什么? (此时可以使用任何系统,尽管有一个 node.js 包装器将是理想的,因为这是将数据提供给前端的东西)或者编写二进制数据会更好吗?

即使是我正在寻找的实际术语或研究的替代数据结构这样简单的东西也会有所帮助。谢谢!

【问题讨论】:

    标签: database data-structures


    【解决方案1】:

    这听起来像是持久二叉搜索树的绝佳用例。持久数据结构是在对结构执行操作后,您会返回两个结构 - 更改前的一个和更改后的一个。至关重要的是,这两个结构的内部表示共享内存,因此如果您有一个 10KB 的集合,则存储前后快照所需的空间远少于 20KB。

    由于您需要键/值存储,因此持久二叉搜索树可能是您的最佳选择。与正常的 BST 一样,所有操作都在 O(log n) 时间内运行。然后,您可以存储所有快照的数组,让您可以 O(1) 访问所需的任何时间片。

    希望这会有所帮助!

    【讨论】:

    • 谢谢!虽然数据结构本身实现起来相对简单,但我不确定实际存储数据以供检索的最佳方式是什么。我也无法将其全部加载到 RAM 中。对于如何在持久存储而不是简单地保留在 RAM 中实际实现它,您有什么建议吗?
    • 有了持久化的BST,每次更新大概会使用log n个新内存,确实不是很多。您必须进行数十亿次更新才能成为问题。是这样吗?
    • 不,不是,每年更新约 1 亿次。不管我不确定我在想什么,它应该可以很好地适应记忆。谢谢!
    【解决方案2】:

    您所说的数据结构通常称为“持久数据结构”,有时也称为“不可变数据结构”。

    【讨论】:

      猜你喜欢
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      相关资源
      最近更新 更多