情况是这样的:我正在开发一个相对较大的 C++ 程序(在 Linux 中)。这个程序可以分为两部分。A 部分只是一堆基于一些数据的预计算,这些数据随着时间的推移保持不变,从而构建了一个非常复杂的大数据结构。问题是 A 部分花费了太多时间(大约一分钟),您可以假设它无法进一步显着优化。紧接在 A 部分之后的 B 部分基本上是对 A 部分加载的数据的一些查询。
所以,这就是我想要做的:因为 A 部分中构建的数据结构总是相同的,有一个它的“快照”不是很好,所以,每次加载程序时,你都可以检索快照中的数据非常快,然后直接跳到 B?
这里的问题是:有没有办法做到这一点?
您所描述的基本上是 HPC 中的“检查点”:您指定了一块可以在程序重新启动时快速恢复的内存,而无需花费大量时间来保存/加载此数据。
那里有很多库或检查点,但我过去使用过Ken效果很好。该库所做的是在固定内存位置创建虚拟内存映射,以及自动将此内存捕获到磁盘并重新加载的机制。
当程序重新启动时,您只需再次映射内存并检查它是否已初始化。因此,您的启动时间几乎减少到零(内存映射文件并根据需要从磁盘加载一些块的时间)。
你没有提供任何代码,所以我不能给你具体的建议,但是你需要确保昂贵的一块的所有内存分配都在 Ken 管理的内存中进行,例如通过实现你自己的由 Ken 支持的内存分配器-托管内存,通过将自定义分配器传递给所有 STL 数据结构,或简单地说服您选择的内存管理库在 Ken 内存中分配内存。对于最后一个选项的一个例子,看到jemalloc的arena.create和thread.arena选项。