我有一个带有一组特定类的n-ary树数据结构。数据结构经历一组转换,例如1到n。在上述转换结束时,最终树是输出结果,用于检索信息。
有没有办法在每次正确的转换后都可以(二进制)转储树。转储将反映上一次转换后树的状态。因此,如果任何转换出错,我可以在内存中恢复转储,无需再次进行正确的转换。它类似于GDB 提供的 检查点功能,用于保存程序状态的快照。
Redis-dump,Neo4j-dump和MongoDB-dump可用,但我无法决定选择哪一个。由于转储创建和恢复时间不应太大,因此上述哪一种更容易填充。
我想知道那些遇到过这个问题的程序员的意见和反馈 他们是如何解决的。这样做的最佳方式是什么?
P.S。我现有的实现是用C ++编写的。如果有任何不清楚的地方,请告诉我,我会尝试以更好的方式解释它。
答案 0 :(得分:2)
您需要做的是向树中的每个节点添加serialize
方法。此方法需要知道如何序列化自身及其所有子代。
序列化节点本身特定于节点中存储的数据,尽管您可能会使用某种形式的Type-Length-Value格式。序列化子项是递归完成的。
唯一棘手的事情是找出你需要创建多大的缓冲区。为此,您可能需要一个可以计算出缓冲区大小的递归方法。
您可以将数据保存在一个漂亮的平面缓冲区中,您可以将其保存为平面文件,也可以将其保存到某种数据库中。
答案 1 :(得分:2)
我相信你想要的是boost :: serialize提供的功能。它将为您序列化和反序列化STL集合。
见这里: http://www.boost.org/doc/libs/1_54_0/libs/serialization/doc/tutorial.html#stl
答案 2 :(得分:1)
在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 ++实现吗?如果替换,则several tools用于将初始数据量导入Neo4j,特别是注意1和2。
如果延伸,则取决于您与数据的交互方式。据我所知,没有非常好的用于C ++的Neo4j驱动程序,尽管有一些或多或少成熟的项目(1,2,3和3, 4)可能会有所帮助。我会run Neo4j as a server并构建一个RESTful客户端(1,2,3),它使用Cypher& (de)序列化JSON与之通信。我会花时间学习制作good cypher queries,并使用transactional server endpoint。但是,我会用Java或Python,或者其他一些语言driver support for Neo4j,可能不是C ++。
<强> 2)强>
没有数据就很难给出例子。首先查看modeling examples,然后在Google Group discussions搜索线程,人们可以详细了解他们如何为域建模和设计查询。例如,Here和here被称为两种不同的关系排序方式;通过关系属性和关系类型。然后,如果您需要帮助建模或查询,请将示例数据放入Neo4j Console并在SO上与您的问题分享链接。 (我在链接控制台中放了一个带有查询的小样本,你可以开始玩它了。)