9

您可以采用哪些流行技术来增加内存数据结构的持久性(即,如果进程崩溃,您可以保留之前对该数据结构执行的所有操作?

如果我的数据结构只涉及一个元组列表,那么我只需将它们存储在 SQL DB 中,这样我就可以免费获得持久性。但是,如果我的数据结构是图或树怎么办?

我能想到的一件事是将所有操作显式记录到磁盘(仅附加日志),并在发生崩溃时重播日志以保留以前的状态。如果日志变得太大,那么就会有一个压缩步骤。我猜这是数据库引擎在内部为持久性所做的事情(检查点就是这个过程的名称)?

顺便说一句,这不是整个数据集不适合内存的情况。

4

6 回答 6

4

您可能想尝试对象流行引擎。对于 .NET,您可能想尝试Bamboo.Prevalence ,它是一个名为Prevayler for Java的类似引擎的端口。

于 2008-10-03T14:25:33.120 回答
1

我已经在 2 家公司的产品中实施了“Mrjb”技术,这基本上正是您在问题中所建议的:“内存驻留日志支持”数据库,一个内存数据结构,每个更改都被记录到磁盘,因为它发生。它对我们很有用!

http://www.edval.biz/memory-resident-programming-object-databases

我很乐意分享我们在生产环境中使用它的实际经验。我喜欢能够回放精确的事件序列或回滚到任何时间点。

于 2011-10-26T00:54:15.747 回答
0

您要查找的词是“序列化”。

于 2008-10-03T14:12:49.107 回答
0

您可以想出一些方法来序列化您的结构,无论是使用 XML、YAML、JSON 等。然后您可以将其存储在数据库中,或者在程序的主要执行点周围放置一个大的 try/catch。然后,如果发生一些未捕获的异常,这将导致程序崩溃,您可以序列化您的数据,并记录任何错误消息、堆栈跟踪等。

于 2008-10-03T14:15:18.007 回答
0

是的,您可能希望将数据序列化为某种格式——xml、二进制等。根据编程语言,这可能是为您内置的。Java 有ObjectStreams,.NET 有XmlSerializerBinaryFormatter

于 2008-10-03T14:15:47.493 回答
0

对您的问题的任何回答都需要执行类似于 ACID 数据库系统的操作。所以我想说你最好的选择是使用 RDBMS 来存储你的应用程序状态,每当你有一个不能丢失的(应用程序)事务时更新。

于 2008-10-03T14:16:42.467 回答