首页 > 解决方案 > 有没有办法制作程序的“可重用快照”?

问题描述

情况如下:我正在开发一个相对较大的 C++ 程序(在 Linux 中)。该程序可以分为两部分。A 部分只是一堆基于一些数据的预计算,这些数据随着时间的推移保持不变,构建了一个非常复杂的大数据结构。问题是 A 部分花费了太多时间(大约一分钟),您可以假设它无法进一步优化。B 部分紧随 A 部分之后,基本上是对 A 部分中加载的数据的一些查询。

所以,这就是我想要做的:因为在 A 部分中构建的数据结构总是相同的,拥有它的“快照”不是很好吗,因此,每次加载程序时,您都可以检索快照中的数据非常快,然后直接跳到 B?

问题来了:有没有办法做到这一点?

标签: c++snapshot

解决方案


您所描述的基本上是 HPC 中的“检查点”:您指定一块内存,如果程序重新启动,可以快速恢复,而无需花费大量时间来保存/加载这些数据。

那里有很多图书馆或检查点,但我过去曾使用过Ken,效果很好。这个库所做的是在一个固定的内存位置创建一个虚拟内存映射,以及一个自动将该内存捕获到磁盘并重新加载它的机制。

当程序重新启动时,您只需再次映射内存并检​​查它是否已初始化。因此,您的启动时间几乎减少到零(内存映射文件并根据需要从磁盘加载一些块的时间)。

您没有提供任何代码,因此我无法给您具体建议,但您需要确保昂贵部分的所有内存分配都在 Ken 管理的内存中进行,例如通过实现您自己的由 Ken 支持的内存分配器-托管内存,通过将自定义分配器传递给所有 STL 数据结构,或者只是说服您选择的内存管理库在 Ken 内存中分配内存。有关最后一个选项的示例,请参阅jemallocarena.createthread.arena选项。


推荐阅读