2

我想实现一个只需要处理二进制数据的快速数据库替代方案。要指定,我想要一些接近数据库的东西,即使在执行期间强制终止(任务管理器)的情况下也能安全存储,同时也可以直接从 C++ 中的内存访问。就像镜像到硬盘的结构向量一样。它应该能够每秒处理数十万次读取访问和至少 1000 次写入访问。在强制终止的情况下,最多可以丢失最后一个命令。它不需要支持多线程,并且数据库文件只能由程序的单个实例访问。只需要在 Windows 上运行。这些是我到目前为止想到的解决方案:

  1. SQL 数据库

    • 优点
      • 易于实现,因为有很多库可用
    • 缺点
      • 服务器在不同的进程上,因此进程间通信可能很慢
      • 解析 SQL 查询的必要性
      • 专为多线程环境而构建,因此有很多不必要的同步
      • 行不能使用指针直接访问,但每次更改至少需要复制两次
      • UPDATE 查询的不必要延迟,因为需要搜索整个表并检查 WHERE 案例
      • 这些只是我脑海中的一些,可能还有更多
  2. 内存映射文件

    • 优点
      • 直接内存映射,因此可以直接访问指针
      • 与数据库相比非常快
    • 缺点
      • 强制终止可能会导致整个页面不被写入
      • 很多代码(我实际上并不介意)
      • 无法强制同步
      • 增加文件大小可能需要很多时间
  3. C++ 向量*
    • 优点
      • 可以直接指针访问,但是需要手动通知更改
      • 与数据库相比非常快
      • 完全的编程自由
    • 缺点
      • 由于对 WriteFile 的多次调用,可能很慢
      • 很多代码(我实际上并不介意)
  4. 每隔几秒完成一次写入的 C++ 向量
    • 优点
      • 可以直接指针访问
      • 与数据库相比非常快
      • 完全的编程自由
    • 缺点
      • 大量未更改的数据被重写到文件,或者大量 RAM 浪费在防止不必要的写入上
      • 在复制过程中浪费大量 RAM 写入期间无法访问
      • 可能会丢失几秒钟的数据
      • 多线程,因此需要同步

*基本上,仅公开向量的每行读/写功能的包装类 OR 允许直接写入内存,但依赖于调用者通知更改,所有读取都从内存中的副本完成,所有写入都完成基于每个命令在内存和文件本身中的副本

此外,是否可以在不刷新的情况下写入文件的不同部分,然后一次刷新所有更改,以保证即使在写入期间强制终止文件也将被完全写入或根本不写入?我能想到的只是以下工作流程:

启动时复制目标文件,然后为每组数据:将所有更改写入副本 -> 通过将原始文件替换为副本来刷新

但是,我觉得这对大文件的硬盘空间来说是一种可怕的浪费。

提前感谢您的任何意见!

4

0 回答 0