我不知道我是否不知道正确的术语,或者我要找的只是一个不常见的结构,所以请容忍我,因为我试图描述我要找的。
现在我有一套分类的。经过简单的修改,它会随着时间而改变。(k,v)对被插入、删除,或者特定密钥的值可能改变。
任何操作都不能或永远不会在一个以上的键上执行。
我需要的是一种方法来存储数据集的每个增量版本,并将其映射到一个时间点。我将需要快速访问它的任何部分,并且能够生成当时存在的精确排序集,以及它如何在时间段内改变。
在每个突变之后存储实际的排序集是不可行的,因为它是大约10kb的数据,平均每秒大约有2-3个突变。这是一个个人项目,因此每天每套(乘以10-20套)写入2.5千兆字节的数据成本高昂。
现在我已经想出了一个解决方案——我的问题就在这里,我想出的解决方案是否有一个术语?有更好的办法吗?
如果我有一个初始数据集Orders,那么下一次数据迭代可以写为Orders + (K,V),而不是存储整个集合两次,我只存储一次实际集合,然后第二次存储为引用+变异。
然后,如果我想访问订单[n],我会迭代订单[0 ] ->订单[n]应用突变,我会产生的集合,因为它存在的时间。
不过,这有一个大问题。我需要能够快速访问任何范围的数据-大约每天250000次迭代*月或年-所以当n很大时,从0->n计算集合是不实际的。这里的明显解决方案是在某个区间缓存所得的集合,而不是一个给定的数据点递归地返回到订单(0),它只需要计算回到Orders[1,500,000]找到在Orders[1,500,100]中存在的集合。
如果我认为这是一种构造数据的好方法,我应该多久缓存一次结果?
像这样的东西存在吗?在我的研究中,很多资料说使用链表或二叉树。我不需要树,因为我的数据是100%连续的,而不是分支。因此,如果我使用链表,我的困惑在于实际存储数据。这就是我完全被困的地方。最好的数据库和数据库模式是什么?(在这一点上可以使用任何系统,尽管拥有node.js包装器是理想的,因为这是向前端提供数据的服务)还是编写二进制数据更好?
即使是一些简单的东西,如一个实际的术语,我正在寻找或一个替代数据结构的研究将是有益的。谢谢!

最佳答案

这听起来像一个持久的二进制搜索树的优秀用例。持久数据结构是在对结构执行操作后,返回两个结构的结构,一个在更改前,一个在更改后。至关重要的是,这两个结构的内部表示共享内存,因此如果您有一个10KB的集合,则存储前后快照所需的空间要少得多。
因为您需要密钥/值存储,所以持久的二进制搜索树可能是您的最佳选择。与普通的bst一样,所有操作都在o(log n)时间内运行。然后,您可以存储所有快照的数组,使您可以(1)访问任何所需的时间片。
希望这有帮助!

09-25 18:03
查看更多