我想实现一个只需要处理二进制数据的快速数据库替代方案。要指定,我想要一些接近数据库的东西,即使在执行期间强制终止(任务管理器)的情况下也能安全存储,同时也可以直接从 C++ 中的内存访问。就像镜像到硬盘的结构向量一样。它应该能够每秒处理数十万次读取访问和至少 1000 次写入访问。在强制终止的情况下,最多可以丢失最后一个命令。它不需要支持多线程,并且数据库文件只能由程序的单个实例访问。只需要在 Windows 上运行。这些是我到目前为止想到的解决方案:
SQL 数据库
- 优点
- 易于实现,因为有很多库可用
- 缺点
- 服务器在不同的进程上,因此进程间通信可能很慢
- 解析 SQL 查询的必要性
- 专为多线程环境而构建,因此有很多不必要的同步
- 行不能使用指针直接访问,但每次更改至少需要复制两次
- UPDATE 查询的不必要延迟,因为需要搜索整个表并检查 WHERE 案例
- 这些只是我脑海中的一些,可能还有更多
- 优点
内存映射文件
- 优点
- 直接内存映射,因此可以直接访问指针
- 与数据库相比非常快
- 缺点
- 强制终止可能会导致整个页面不被写入
- 很多代码(我实际上并不介意)
- 无法强制同步
- 增加文件大小可能需要很多时间
- 优点
- C++ 向量*
- 优点
- 可以直接指针访问,但是需要手动通知更改
- 与数据库相比非常快
- 完全的编程自由
- 缺点
- 由于对 WriteFile 的多次调用,可能很慢
- 很多代码(我实际上并不介意)
- 优点
- 每隔几秒完成一次写入的 C++ 向量
- 优点
- 可以直接指针访问
- 与数据库相比非常快
- 完全的编程自由
- 缺点
- 大量未更改的数据被重写到文件,或者大量 RAM 浪费在防止不必要的写入上
- 在复制过程中浪费大量 RAM 写入期间无法访问
- 可能会丢失几秒钟的数据
- 多线程,因此需要同步
- 优点
*基本上,仅公开向量的每行读/写功能的包装类 OR 允许直接写入内存,但依赖于调用者通知更改,所有读取都从内存中的副本完成,所有写入都完成基于每个命令在内存和文件本身中的副本
此外,是否可以在不刷新的情况下写入文件的不同部分,然后一次刷新所有更改,以保证即使在写入期间强制终止文件也将被完全写入或根本不写入?我能想到的只是以下工作流程:
启动时复制目标文件,然后为每组数据:将所有更改写入副本 -> 通过将原始文件替换为副本来刷新
但是,我觉得这对大文件的硬盘空间来说是一种可怕的浪费。
提前感谢您的任何意见!