【问题标题】:Do you know of a C dictionary that supports COW transactions?你知道支持 COW 事务的 C 字典吗?
【发布时间】:2010-03-16 09:01:32
【问题描述】:

我正在寻找一个用 C 编写的键 -> 值字典库,它支持理论上无限数量的廉价交易。

我想在内存中有一个字典,数百个线程开始事务,可能修改字典,结束(完成)事务或可能中止事务。这些线程只有 50% 的时间会真正修改字典。

我见过的大多数字典事务实现总是在事务启动时复制,而不是在写入时复制。鉴于字典的预期大小(> 1GB),我希望仅在事务期间实际更改某些内容时才能找到 COW 的内容。我也希望大多数主要的 GNU/Linux 发行版都打包了一些东西。

非常感谢任何建议或链接。

【问题讨论】:

    标签: c linux dictionary transactions


    【解决方案1】:

    SQLite3 是事务性的,可以完全存在 in memory。在交易方面,它不像某些人可能喜欢的那样 便宜,但也不是那么昂贵。快速的 mlock() / mlockall() 可以防止 DB 被分页,YMMV 与 posix_madvise()。它不是开箱即用的解决方案,但也不太难适应。

    BDB 是甲骨文目前市场上的另一种选择。

    SQLite3 (几乎)完美地满足了我的需求。鉴于我通过提出这个问题获得了Tumbleweed badge,所以我至少可以回答它。

    【讨论】:

      【解决方案2】:

      对于基本的字典需求,SQLite 不是矫枉过正吗?通常,如果您不打算执行查询,数据库的开销是不必要的。

      BDB 绝对很棒,一段时间以来我一直想将它整合到我的一些项目中,听起来你肯定会从它的性能提升中受益。

      最简单的解决方案可能是创建一个包装类(即 COWString)来实现写时复制行为,然后创建包装对象的 stl::map 或 hash_map。这样,您就可以从容器逻辑中抽象出 COW 逻辑,这也将使您不必编写自己的容器类以及其中的巨大复杂性。

      【讨论】:

      • 是事务让你受益匪浅,尤其是在数百个线程使用普通快速互斥体来控制它们的情况下。我花了相当多的时间尝试事情。 SQLite 接近我自己的堆配置文件(无论如何,就地块而言)并且提供了更大的灵活性。
      猜你喜欢
      • 2023-04-09
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 2015-08-26
      相关资源
      最近更新 更多