【问题标题】:list/map of key-value pairs backed up by file on disk由磁盘上的文件备份的键值对的列表/映射
【发布时间】:2012-02-08 10:12:19
【问题描述】:

我需要创建一个存储在磁盘上的键值对列表(类似于std::map<std::string, std::string>),可以同时被多个线程访问。可以添加或删除键,可以更改值,键是唯一的。假设整个东西可能无法立即放入内存,因此必须将地图的更新保存到磁盘。

问题是我不确定如何解决这个问题。我了解如何处理多线程问题,但我不确定哪种数据结构适合在磁盘上存储数据。如果我正面解决问题,几乎我能想到的任何东西都会显着改变结构并导致磁盘存储大量覆盖。另一方面,关系数据库和windows注册表处理这个问题,所以必须有办法解决它。

是否有针对这种情况“制作”的数据结构?
还是我只是简单地使用任何传统的数据结构(例如树或跳过列表)并制作某种“内存管理器”(磁盘支持的“堆”)来分配磁盘空间块,根据请求将它们加载到内存中并卸载必要时将它们放到磁盘上?我可以想象如何编写这样的“基于磁盘的堆”,但这种解决方案并不是很优雅,尤其是当您在图片中添加多线程时。

想法?

【问题讨论】:

    标签: c++ algorithm map


    【解决方案1】:

    总而言之:一旦将内容写入磁盘,您就不再需要处理“数据结构”,而是处理“序列化”和“数据库”。

    C++ STL 及其数据结构并没有真正解决这些问题,但幸运的是,成千上万的程序员已经解决了数千次。他们有 99.9% 的机会写过适合你的东西。

    根据您的描述,sqlite 听起来对您的应用程序来说是一个不错的、平衡的选择。

    【讨论】:

    • 嗯,我知道 sqlite 和类似的库/项目,但我需要从头开始编写这个东西。所以问题是如何去做。我只是需要有人指出正确的方向,因为到目前为止我能想到的解决方案并不是很优雅。
    • 您正在做的事情不是易于实施的事情。要拥有良好的性能、并发性和大于内存的数据集,除此之外,运行良好且没有错误,您可能需要花费比最初计划在项目上花费更多的时间来从头开始编写数据库。如果这是作业帮助,请相应地标记它,如果不是,则不应有理由不使用经过验证的库来提供帮助。
    • @SigTerm 为什么你“需要”从头开始写这个?
    • @sirbrilliance: 不是作业(不知道有没有人会这样下作业)
    • @Nick Johnson:“为什么你‘需要’从头开始写这个?”我被要求这样做,这是与工作有关的。不过,如果我愿意,我可以拒绝这个请求。无论如何,我可能会写那件事(不会很漂亮,但它会起作用),但我问了这个问题,因为我认为我可能错过了重要的信息,并且有一种众所周知的优雅方式可以做到这一点。
    【解决方案2】:

    如果您只需要通过键进行查找(以及插入、删除),而不是更复杂的基于字段的查询,BDB 可能是您的应用程序的更好选择。

    【讨论】:

      【解决方案3】:

      为您的方案“制作”的数据结构是B-tree 或其变体,例如B+ tree

      【讨论】:

        猜你喜欢
        • 2015-10-23
        • 1970-01-01
        • 2012-12-23
        • 1970-01-01
        • 2011-10-26
        • 2011-03-12
        • 2012-07-12
        • 1970-01-01
        • 2015-01-08
        相关资源
        最近更新 更多