将树数据结构转储到文件/从文件还原树数据结构

Dump and restore a tree data structure to/from a file

本文关键字:文件 数据结构 还原 转储      更新时间:2023-10-16

我有一个n元树数据结构,其中包含一组特定的类。数据结构经过一组转换,例如 1 到 n。在上述转换结束时,最终的树是用于检索信息的输出结果。

有没有办法在每次正确转换后(二进制)转储树。转储将反映上一次转换后树的状态。因此,如果任何转换出错,我可以在不再次进行正确转换的情况下恢复内存中的转储。它类似于 GDB 提供的用于保存程序状态快照的检查点功能。

  • 我查看了NoSQL数据库,如MongoDB,CouchDB,Redis等,但它们主要是键值数据存储(Redis)或将信息存储在文档类型结构中,而不存储树中节点之间的关联/关系(MongoDB)。
  • 我还查看了Neo4j图形数据库,这是表示类似图形结构的好工具。

Redis-dump,Neo4j-dump和MongoDB-dump可用,但我无法决定从中选择哪一个。以上哪项更容易填充,因为转储创建和还原时间不应很大。

我想知道遇到这个问题的程序员的意见和反馈 以及他们是如何解决的。最好的方法是什么?

附言我现有的实现正在C++。如果有什么不清楚的地方,请告诉我,我会尝试以更好的方式解释它。

我相信你想要的是boost::serialize提供的功能。它将为您序列化和反序列化 STL 集合。

看这里:http://www.boost.org/doc/libs/1_54_0/libs/serialization/doc/tutorial.html#stl

您需要

做的是向树中的每个节点添加一个serialize方法。此方法需要知道如何序列化自身及其所有子级。

序列化节点本身特定于节点中存储的数据,尽管您可能会使用某种形式的类型-长度-值格式。序列化子项以递归方式完成。

唯一棘手的事情是找出您需要创建多大的缓冲区。为此,您可能需要一个可以计算缓冲区大小的递归方法。

将数据保存在一个漂亮的平面缓冲区中,您可以将其保存到平面文件中,或者如果更容易,可以保存到某种数据库中。

在 Neo4j 中,简单地在数据库中维护每一代模式,直到您对结果感到满意,然后删除多余的世代,对您有用吗?您可以创建一个节点,例如

(t1:Transformation {transformationId:1})

用作一组转换的索引或锚点,然后创建模式的每一代新生成,并使用具有排序属性的关系将其与转换节点相关联

(t1)-[:STEP {order:0}]->(root)-[:..*]->(branch) //tree
(t1)-[:STEP {order:1}]->(transformedRoot)-[:..*]->(transformedBranch) //first transformed tree
(t1)-[:STEP {order:2}]->(transformedRoot2)-[:..*]->(transformedBranch2) //second transformed tree

转换中未更改的节点可以直接包含在新模式中

(t1)-[:STEP {order:3}]->(transformedRoot)-[:..*]->(originalBranch) // transformed tree with original branch

直到它们确实被改变

(t1)-[:STEP {order:4}]->(transformedRoot)-[:..*]->(transformedBranch)

只要您愿意,您就可以拥有每个转换的快照,并且可以在数据库中与它交互以回滚、比较或执行任何您想要的操作,而不是导出/导入转储。

编辑:
重新发表您的评论
1)
Neo4j会扩展或取代您的C++实现吗?如果替换,有几个工具可以将初始数量的数据导入 Neo4j,特别是注释 1 和 2。

如果扩展,则取决于您如何与数据交互。据我所知,没有很好的 Neo4j 驱动程序用于C++,尽管有一些或多或少成熟的项目(1,2,3 和 3,也是 4)可能会有所帮助。我会将Neo4j作为服务器运行,并构建一个RESTful客户端(1,2,3),该客户端使用Cypher和(反)序列化的JSON与之通信。我会花时间学习制作好的密码查询,并利用事务服务器端点。但是,我会在Java或Python或其他一些对Neo4j有良好驱动程序支持的语言中执行此操作,可能不是C++。

2)
没有数据很难举例。首先查看建模示例,然后在 Google 群组讨论中搜索主题,在这些主题中,人们详细了解了他们如何对自己的网域建模和设计查询。例如,这里和这里指的是两种不同的关系排序方式;按关系属性和关系类型。然后,如果您需要建模或查询方面的帮助,请将示例数据放入 Neo4j 控制台,并将链接与您的问题一起分享。(我在链接的控制台中放了一个带有查询的小样本,您可以开始使用它。