非易失性C++映射结构的备份方案
Backup scheme for non-volatile C++ map constructs
我经常在C++代码中使用std::map或tr1::hashed_maps。我有一个即将到来的项目,我通常会默认使用这样的构造,但在这个项目中,我要求这样的映射是非易失性的。即,在应用程序终止时(安全关闭或意外死亡,如断电),地图数据应安全存储在磁盘上,并在随后的应用程序执行时恢复。请注意,这并不要求在断电之前存储每一位数据,只需要在几秒钟之前存储。
要求仍然是应用程序在访问和存储映射方面必须具有高性能。显然,"高性能"是主观的,但每秒会有数百万次加载/存储到地图中。
这让我"猜测"我应该使用SQL数据库,但我对数据库缺乏经验,并担心从简单的C++容器转移到完整的SQL基础结构会导致相当大的性能下降。SQL"缓存"会以某种方式减轻性能影响吗?
或者,一个简单的答案可能只是频繁地(比如每10-30秒)将映射的副本写入(串行化)磁盘。根据地图的大小(至少有数百万个条目),这可能是不明智的。
有推荐吗?
谢谢!
使用最好的锤子钉钉子,尽管事实上你对你的c++锤子最满意(我会在同一条船上。)
就性能和数据完整性而言,数据库似乎是您的最佳选择。它们是为了处理你在帖子中描述的那种场景而构建的。
那么,我认为你需要做的两件事是:
- 为您想要存储的信息类型开发一个坚实的数据库模型。我不是这方面的专家,但我知道做好这件事很重要
- 对一个好的C++数据库包装器做一些研究。这样,您就可以将MySQL的详细信息留给库,并可以专注于您最强大的地方
如果未来没有增强功能的计划,那么简单的C++方法是好的。Redis或Cassandra等关键价值商店可能非常适合您的需求。它们透明地处理存储和中断,并在一台机器不足时增强对多台机器的存储。它们的性能非常好,在某些情况下甚至可能优于C++代码。除非在多台计算机上运行,否则完整的SQL数据库对于您的目的来说太慢了。
如果每秒有数百万个存储到映射,那么一个足够快的SQL将非常涉及到一些你似乎是事后才想到的事情。密钥库可能对你的应用程序更好,但如果你真的达到了性能极限,你可能会考虑只写一个你对内存存储进行更新的日志。您可以从日志中重建内存中的存储,以满足您的持久性要求。
您仍然可以使用您的地图,它被包裹在处理地图上操作的对象中。修改映射的操作除了修改内存中的映射外,还会更新磁盘上的存储。
然后,您的下一个问题将是确定哪种存储模型最适合您的数据,例如sql数据库,或者可能是记录所有更新的日志,也可能是具有固定大小记录和您自己的索引方案的二进制文件。
如果还要求数据库可以在几个用户之间共享,每个用户都可能更新数据库,那么您还需要添加一种机制来保持地图同步。。。也许到那时,总是查询会变得更容易。但在任何情况下,到那时您的对象都可以处理数据上的所有操作,并且只需要替换该对象的内部。
我不是您的应用程序的用户,但在关闭时存储大量数据是个坏主意,原因有很多:
-
当有人想关闭你的应用程序时,他们希望它能很快关闭,而不是停留很长时间。如果它不倒下,他们很可能会杀死它
-
如果他们"崩溃",您的数据将无法保存。
因此,定期保存是一个更好的主意,为此,当行当前未保存时,您可能希望将其标记为"脏",这意味着您可能希望有更多数据来标记脏记录。这可以通过一组简单的键或向量来完成,这些键的数据是脏的,并定期保存它们并删除它们的脏状态。
在关闭时,你会写下任何剩余的脏记录,但不会有太多。
这在很大程度上取决于地图更改的频率。
还要记住,用户交互应该始终具有最高优先级,并且任何"脏"成员对持久性的提交都应该发生在优先级较低的后台线程中。
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- 计算每个节点的树高,帮助我解释这个代码解决方案
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- visual c++,如何获取解决方案目录中的代码
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- C++Matching Brackets 2解决方案不起作用
- 在 ubuntu3 上C++ goto 定义有什么解决方案吗16.04?
- C++11 中不同类型的对象的 std::array 的替代方案
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 无法在问题解决方案中执行输出逻辑
- 最大的回文产品 - 程序未运行,编写解决方案但无法理解问题
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- 在一个解决方案中针对第三方静态库 (Creo) 的不同版本(版本)进行构建
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- N-queen问题:无法弄清楚为什么我的解决方案不起作用
- 非易失性C++映射结构的备份方案