快速二进制数据库替代

时间:2016-07-21 04:34:56

标签: c++ database windows data-storage data-consistency

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

  1. SQL数据库

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

    • 优点
      • 直接内存映射,因此可以直接指针访问
      • 与数据库相比非常快
    • 缺点
      • 强行终止可能会导致整个页面无法写入
      • 很多代码(我其实并不介意)
      • 无法强制同步
      • 增加文件大小可能需要很长时间
  3. C ++ vector *
    • 优点
      • 直接指针访问可能需要手动通知更改
      • 与数据库相比非常快
      • 总编程自由
    • 缺点
      • 由于多次调用WriteFile
      • ,可能会很慢
      • 很多代码(我其实并不介意)
  4. C ++向量,每隔几秒完成一次写入
    • 优点
      • 可以直接指针访问
      • 与数据库相比非常快
      • 总编程自由
    • 缺点
      • 大量未更改的数据被重写到文件中,或者大量的RAM浪费在防止不必要的写入上
      • 在写入大量RAM时无法访问复制
      • 可能会丢失多秒数据
      • 需要多个线程及其同步
  5. *基本上,一个包装类只暴露每行的向量读/写功能或允许直接写入内存,但依赖于调用者来通知更改,所有读取都是从内存中的副本完成的,所有写操作在每个命令的基础上完成内存中的副本和文件本身

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

    启动时复制目标文件,然后为每组数据复制: 将所有更改写入重复 - >通过替换原件重复冲洗

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

    提前感谢任何输入!

0 个答案:

没有答案