程序的类似冬眠的保存状态
hibernate-like saving state of a program
在c++或Java或Python中是否有任何方法允许我保存程序的状态,而不会被问任何问题?例如,我花了一个小时学习如何将树状结构保存到文件中。很有教育意义,但我觉得我只能这样做:
saveState(file);
和"文件"将包含我的程序使用的全部内存。就像操作系统的"休眠"或"挂起到磁盘"功能一样。我知道boost序列化,这可能不是我要找的
您最可能需要的是我们所说的序列化或对象编组。有一大堆关于数据/对象序列化的学术问题,你可以很容易地谷歌一下。
也就是说,给定正确的库(可能是非常原生的),您可以对正在运行的程序进行真正的快照,类似于"特定于操作系统的hibernate"。下面是在Linux上做这个的SO答案:https://stackoverflow.com/a/12190830/318174
要执行上述快照,您很可能需要一个来自您想要保存的进程的外部进程。我强烈建议你不要那样做。相反,在中阅读/查找您选择的语言(顺便说一句,欢迎来到SO,不要标记每种语言…这让人很恼火)如何进行序列化或对象编组……提示……现在大多数人选择JSON
我认为你所描述的是一个很少有人会真正想在一个真正的系统中使用的特性。通常,您希望保存一些内容,以便传输,或者停止运行程序,或者防止程序退出(或电源故障)的可能性。
在大多数生产系统中,人们希望对磁盘的写操作较小且是增量的,这样系统就可以保持响应,并且可以避免写入不一致的数据。定期将所有内存写入磁盘可能会导致大量无响应时间。您需要锁定整个系统以避免不一致的状态。
编写您自己的持久化是乏味且容易出错的,但是您可能会发现这个问题很有趣:持久化图形数据(Java)
围绕这一点有几个框架。如果您需要Java、Python和c++的支持,请查看Google Protocol Buffers https://developers.google.com/protocol-buffers/我在一些项目中使用过它,它工作得很好。
还有Thrift(最初来自Facebook) http://thrift.apache.org/我没有任何使用经验。
另一个选择是@QuentinUK建议的。使用继承自可流对象的类和/或创建可流操作符/函数。
我会用框架
你的问题是:
- http://en.wikipedia.org/wiki/Address_space_layout_randomization
在古代(带有扩展程序的16位DOS程序),编译器曾经支持存储相对地址的"基于"指针。它们可以安全地连载。应用程序这样做,保存代码和数据,序列化的模块被称为"覆盖"。
今天,您需要在工具链中提供基于指针的支持(导致每个指针访问都需要额外的调整),或者遍历所有数据,将指针与其他数据区分(如何区分?)并将它们调整到新的存储位置,以防操作系统已经在旧程序用于其堆的相同地址加载了一些库。在现代"托管"环境中,指针已经必须为垃圾收集器标识,即使不经常这样做,这也是可行的。在本机代码中,这是非常困难的,尽管创建元数据是为了启用共享库的重定位。
因此,人们最终需要手动遍历整个数据结构,并将对象链接(指针)转换为可以在另一端恢复的东西,即使对象有一个新地址(再次,因为旧地址可能已被用于共享库)。
请注意,许多处理器都有支持基于寻址的特性…而且,由于基于寻址不再常见,编译器继续使用这些指针算术特性来加速用户代码。
是的,从streamable类中派生对象并添加流函数。然后您可以将所有内容流式传输到磁盘。为此,您需要一个库,例如MFC。
- 如何保存RNN的状态以从TF中的图中提交
- 无法恢复我的安卓 c++ 游戏的状态(状态>保存状态始终为空)
- 如何在 Tensorflow C++ 中定义变量的自定义有状态 Op 保存值
- 使用导入的图像保存在 QT 中的 QLabel 中,保存 GUI 的状态
- 如何在C++中保存和恢复 TensorFlow 图及其状态
- Q油漆保存状态
- 如何使用CUDA CURAND保存和恢复随机数生成器的状态
- C++在保存受用户输入影响的变量的状态时使用临时变量或类变量
- 在基于对话框的MFC应用程序中保存和恢复元素的状态
- 类成员变量未保存状态
- 设计模式保存MFC对话框控件状态的步骤
- QtT 如何在 QMainWindow 中更改中央小部件时保存数据/状态
- 将QCheckBox的状态保存在文件中,并在程序重新启动时加载状态
- 是否有必要在此处保存 FPU 状态
- Qt QStandardItem setCheckable(true) 不保存复选框状态
- 如何保存std::mersenne_twister_engine的状态以便以后恢复
- 保存调试状态以跳过长时间的计算
- 保存复杂的脚本对象的状态
- 比使用流来保存boost随机生成器状态更快的替代方案
- 程序的类似冬眠的保存状态