c++ - 有没有办法制作程序的“可重用快照”?
问题描述
情况如下:我正在开发一个相对较大的 C++ 程序(在 Linux 中)。该程序可以分为两部分。A 部分只是一堆基于一些数据的预计算,这些数据随着时间的推移保持不变,构建了一个非常复杂的大数据结构。问题是 A 部分花费了太多时间(大约一分钟),您可以假设它无法进一步优化。B 部分紧随 A 部分之后,基本上是对 A 部分中加载的数据的一些查询。
所以,这就是我想要做的:因为在 A 部分中构建的数据结构总是相同的,拥有它的“快照”不是很好吗,因此,每次加载程序时,您都可以检索快照中的数据非常快,然后直接跳到 B?
问题来了:有没有办法做到这一点?
解决方案
您所描述的基本上是 HPC 中的“检查点”:您指定一块内存,如果程序重新启动,可以快速恢复,而无需花费大量时间来保存/加载这些数据。
那里有很多图书馆或检查点,但我过去曾使用过Ken,效果很好。这个库所做的是在一个固定的内存位置创建一个虚拟内存映射,以及一个自动将该内存捕获到磁盘并重新加载它的机制。
当程序重新启动时,您只需再次映射内存并检查它是否已初始化。因此,您的启动时间几乎减少到零(内存映射文件并根据需要从磁盘加载一些块的时间)。
您没有提供任何代码,因此我无法给您具体建议,但您需要确保昂贵部分的所有内存分配都在 Ken 管理的内存中进行,例如通过实现您自己的由 Ken 支持的内存分配器-托管内存,通过将自定义分配器传递给所有 STL 数据结构,或者只是说服您选择的内存管理库在 Ken 内存中分配内存。有关最后一个选项的示例,请参阅jemalloc的arena.create
和thread.arena
选项。
推荐阅读
- excel - 如何计算匹配多个条件的行
- java - java.lang.NoClassDefFoundError:无法初始化类 org.apache.jasper.compiler.EncodingDetector
- angular - 如何计算已读为真的列表的长度
- assembly - 8086汇编语言程序:从输入数字数组中找到所有大于单个输入数字的数字的程序
- amazon-web-services - 防火墙上Cloud Front的IP白名单
- swift - 在一个视图控制器中创建动态collectionview
- amazon-web-services - 如何使用 cloudformation 模板将 Fargate 集群服务与任务定义集成/链接
- traefik - Traefik Healthcheck 显然会导致间歇性 RST
- javascript - 将道具转移到那里后如何重新渲染React Native Component
- http - socketio如何过滤事件(特别是flask-socketio)