将树数据结构转储到文件/从文件还原树数据结构
Dump and restore a tree data structure to/from a file
我有一个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 控制台,并将链接与您的问题一起分享。(我在链接的控制台中放了一个带有查询的小样本,您可以开始使用它。
- 将文本文件解析为树状数据结构
- 将文件读入数据结构
- 用指向文件的指针存储数据结构
- 将文件目录打印到数据结构中
- 多线程和共享资源:使用C++定期将数据从缓冲区(数据结构)复制到文件
- 使用文件和结构读取数据并输出数据
- 如何在结构中存储二进制文件数据
- 是否值得两次通过文件进行迭代,以创建最小的数据结构
- 最佳数据结构存储文本文件中的数字集
- C++ 从文本文件数据类型读取为结构,并将数据存储在列表的向量中
- 文件系统中的数据结构存储
- 使用二进制模式将数据结构写入文件
- 要存储到数据结构中的制表符分隔的文件数据
- 在C++中将数据和时间分配给文件时间结构
- 从二进制文件读取结构数据时获取垃圾值
- 将数据从文件加载到C++中的数据结构并对其进行解释
- 将树数据结构转储到文件/从文件还原树数据结构
- 将大数据文件读入数据结构 c++
- c或c++中是否有头文件来实现图、树等数据结构
- 使用char*和std::list将数据结构写入二进制文件