您可以采用哪些常用技术来为内存数据结构添加持久性(即)如果进程崩溃,您可以保留该数据结构上以前执行的所有操作吗?
如果我的数据结构只涉及元组列表,那么我只是将它们存储在SQL DB中,这将免费提供耐用性。但是如果我的数据结构是图形或树呢?
我能想到的一件事是将所有操作显式记录到磁盘(仅附加日志),并在发生崩溃时重播日志以保留以前的状态。如果日志变得太大,那么将会有压缩步骤。我猜这是数据库引擎在内部为持久性做的事情(检查点是这个过程的名称)?
请注意,这不是整个数据集不适合内存的情况。
答案 0 :(得分:4)
您可能想尝试object prevalence engine。对于.NET,您可能需要尝试Bamboo.Prevalence,它是Java的类似引擎Prevayler的端口。
答案 1 :(得分:1)
我在两家公司的产品中实施了“Mrjb”技术,这基本上就是您在问题中提出的建议:“内存驻留期刊备份”数据库,内存数据结构,每次更改在发生时记录到磁盘。它对我们很有用!
http://www.edval.biz/memory-resident-programming-object-databases
我很乐意在生产环境中分享我们的实际经验。我喜欢能够重播一系列精确事件或回滚到任何时间点。
答案 2 :(得分:0)
您正在寻找的词是“序列化”。
答案 3 :(得分:0)
你可以想出一些方法来序列化你的结构,无论是使用XML,YAML,JSON等。然后你可以将它存储在数据库中,或者可以在主执行点周围放置一个大的try / catch到程序。然后,如果发生一些未捕获的异常,这将导致程序崩溃,您可以序列化您的数据,以及记录任何错误消息,堆栈跟踪等。
答案 4 :(得分:0)
是的,您可能希望将数据序列化为某种格式 - xml,二进制等等。根据编程语言,这可能是内置的。 Java有ObjectStreams,.NET有XmlSerializer,还有BinaryFormatter。
答案 5 :(得分:0)
对你的问题的任何答案都需要像ACID数据库系统那样做。所以我想说最好的办法是使用RDBMS来存储你的应用程序状态,只要你有一个不应该丢失的(应用程序)事务就会更新。