繁体   English   中英

将树数据结构转储到文件或从文件恢复树数据结构

[英]Dump and restore a tree data structure to/from a file

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

有没有一种方法可以在每次正确转换后(二进制)转储树。 转储将反映上一转换后树的状态。 因此,如果任何转换出错,我可以将转储还原到内存中,而无需再次进行正确的转换。 它类似于GDB提供的用于保存程序状态快照的Checkpoint功能

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

Redis-dumpNeo4j-dumpMongoDB-dump可用,但我无法决定从哪一个中选择。 由于转储创建和还原时间不应太大,因此上述哪一项将更易于填充。

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

PS我现有的实现是在C ++中。 让我知道是否有任何不清楚的地方,我会尝试以更好的方式进行解释。

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

尽管您可能会使用某种形式的Type-Length-Value格式,但是序列化节点本身特定于节点中存储的数据。 子级序列化是递归完成的。

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

您可以将数据保存在一个漂亮的平面缓冲区中,既可以将其保存到平面文件中,也可以将其保存到某种数据库中。

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

参见此处: http : //www.boost.org/doc/libs/1_54_0/libs/serialization/doc/tutorial.html#stl

在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,特别是注意12

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM